我真的不喜欢把我的SQL服务器打开到互联网上的概念——即使我可以锁定防火墙。然而,我一直直接使用数据库。我现在正在构建一个系统,其中包括1个SQL Server数据库、一个ASP.NET/C#中的web应用程序和一些DelphiXE2中的windows应用程序。但从一开始,我就想在数据库周围放一些"过滤器",这样我就不必打开它了。
我知道这里面有很多东西,但我对它们一无所知,也不知道我的场景会得到什么。我希望将其保留为SQL Server本机;我不打算使用任何其他类型的数据库引擎。
它需要通过标准SQL连接以外的其他方式(如过滤器)从客户端连接到服务器。它创建自己的加密数据包,并以自己的方式传输数据。我将有一个Delphi和C#的包装类,这两个类将非常相同,并且能够将其数据流式传输到DLL中与DB交互。
现在我可以用三种不同的方法来解决这个问题。。。
- 完整的SQL Server包装器,很可能没有源代码,甚至可能有自己的语言(我不想使用另一种数据库语言),并作为自己的独立系统独立于我的项目
- 开源包装器,最好是Delphi(XE2),如果不是C#,则是我的系统的特定协议,完全专用于我的项目,并且是DLL的最终形式,可以在网站(C#)和应用程序(Delphi)上使用
- 网络服务-然而,我只有一个托管点(支付1个网站,第二个网站将对我收取双倍费用)。我无法托管任何额外的web服务或windows服务;它必须与网站集成。否则,我会为此做一个网络服务
我更喜欢第二种选择,不想接近第一种,也根本做不到第三种。
那么,有什么好的数据库层库吗?德尔福XE2中可能已经安装了一些吗?我想也许是加密的XML数据包?
举个例子,假设我有一张"客户"表。在我的网站和应用程序中,我不应该有任何像select * from Customers
这样的SQL脚本,或者通常没有SQL脚本。相反,我将在数据库周围使用一个包装器。因此,我可以调用DBGetCustomers(Conditions: TGetCustomersConditions): TDBCustomers;
这样的函数,其中TGetCustomersConditions
是过滤查询的某种方式,TDBCustomers
表示查询的结果。
还可以有一个函数DBAddCustomer(Item: TCustomerToAdd): TInsertSuccess;
,其中TCustomerToAdd
表示要插入的内容,TInsertSuccess
表示任何结果,例如受影响的错误消息或行。我不打算让它像这样运行,而只是解释任何包装器的概念。当应用程序向服务器发送请求时,它仍然没有将任何内容转换为SQL查询。当请求到达服务器(能够连接到数据库)时,服务器会单独解码SQL查询的所有内容。
即使只有一个"托管点",问题是什么?web服务只是一个"站点"。即使只有一个IP地址,web服务器也可以轻松地托管多个站点。不管怎样,您要寻找的是多层设计中的"应用程序服务器"。
虽然Java在这个方向上投入了大量资金,但MS没有。Delphi有一个Datasnap,它是一个普通的框架,不知道新的"restful"接口是否可以很容易地从C#调用,尽管它看起来有安全缺陷。.NET的方法是使用WCF,只要它使用一个标准协议,你就可以从Delphi调用它。
您还可以查看RemObjects数据摘要。它不是开源的,但它是一个成熟的库。
实现这一点的"传统"方法之一是通过Web服务(尽管现在有些人认为这种技术有点过时)。
一个缺点是,它不是一个可以在数据库中随意使用的通用包装器,但它的优点是,例如,可以将对数据库的访问轻松地限制在特定的存储过程中,这将最大限度地提高安全性,如果您希望对外部应用程序提供有限的授权访问,这是一种标准技术。
如果您已经使用ASP.NET C#web应用程序,您还可以将基于WCF(Windows Communication Foundation)的web服务添加到您的网站。这可以提供对外部应用程序的数据库访问,这些应用程序需要以某种方式连接web服务。通过将web服务映射到特定的上下文路径(如www.example.com/services/servicename ),甚至可以将相同的HTTP标准端口用于普通网站页面和服务
Kbmw允许您创建一个ntier数据库体系结构。
但是,由于您有一个web应用程序,一个更好的选择是WCF(如前所述)