2012-02-02 39 views
0

我真的不喜欢将我的SQL服务器打开到互联网的概念 - 即使我可以锁定防火墙。不过,我一直在直接使用数据库。我现在正在构建一个系统,其中涉及1个SQL Server数据库,ASP.NET/C#中的Web应用程序以及Delphi XE2中的几个Windows应用程序。但是从一开始,我想在数据库中添加一些“过滤器”,所以我不必打开它。用于Delphi和C的SQL Server层#

我知道这里有很多东西,但不知道他们的任何事情或者我的场景。我想保留它原生的SQL Server;我不打算使用任何其他类型的数据库引擎。

它需要通过除标准SQL连接之外的其他方式(如过滤器)从客户端连接到服务器。它创建自己的加密数据包并以自己的方式传输数据。我将为Delphi和C#提供一个包装类,它们几乎完全相同 - 并且能够将数据流式传输到DLL中与数据库进行交互。

现在有三种不同的方式,我可以去这个...

  • 完整的SQL服务器的包装,最有可能没有源代码,甚至可能有它自己的语言(我不想去接另一种数据库语言),并独立于我的项目作为其自己的独立系统。
  • 开源包装,最好在Delphi(XE2)中,或者如果不是C#,我的系统的特定协议,完全专用于我的项目,以及可以在网站上使用的最终形式的DLL在C#中)和应用程序(在Delphi中)。
  • 网络服务 - 但我只有1个托管点(支付1个网站,第二个网站将是我的双重收费)。我无法托管任何其他Web服务或Windows服务;它必须与网站整合。否则,我会为此做一个Web服务。

我更喜欢第二种选择,不想接近第一个选择,也不能完成第三个选择。

因此,任何好的数据库图书馆的库?并且可能会有一些已经安装在Delphi XE2中?我想可能是一个加密的XML数据包?

作为一个例子,假设我有一个'客户'表。在我的网站和应用程序中,我不应该有任何SQL脚本,比如select * from Customers或者一般没有SQL脚本。相反,我将在数据库中包装一个包装。所以我可以调用一个函数,如DBGetCustomers(Conditions: TGetCustomersConditions): TDBCustomers;,其中TGetCustomersConditions是对查询进行过滤的一些方式,TDBCustomers代表查询的结果。

也可能有一个函数DBAddCustomer(Item: TCustomerToAdd): TInsertSuccess;其中TCustomerToAdd表示要插入的内容,而TInsertSuccess表示任何结果,例如错误消息或受影响的行。我并不打算像这样正在正好,但只是为了解释任何包装的概念。当应用程序向服务器发送请求时,它仍然没有将任何内容转换为SQL查询。在请求到达服务器(可以连接到数据库)的时候,服务器单独解码所有的SQL查询。

+0

我很想从这些downvoters知道这个问题怎么是“没有用” - 我很怀疑我”是世界上唯一想要在其数据库中放置一层以确保安全的人。 – 2012-02-02 14:17:10

+0

不幸的是,你只需要习惯它(+1)。我曾经从一些明显从未理解相关概念的人那里得到了一些可笑的投票。不知道允许匿名投票的要点是什么 - 我认为一个理由应该是强制性的! – Peter 2012-02-02 21:14:24

+0

我坚持同样的事情 - 如果有人想downvote,它应该至少需要20个字符描述为什么。 – 2012-02-03 00:55:55

回答

3

问题是什么即使你只有一个“托管点”?网络服务只是一个“网站”。即使只有一个IP地址,Web服务器也可以轻松托管多个站点。无论如何,你要找的是多层设计中的“应用服务器”。虽然Java在这方面投入巨资,但MS并没有。 Delphi有Datasnap,这是一个马马虎虎的框架,不知道新的“平静”界面是否可以从C#轻松调用,但它看起来存在安全漏洞。 .NET的做法是使用WCF,只要它使用一个标准的协议,你可以调用,如果从德尔福很好。

你也可以看看RemObjects DataAbstract。这不是开源的,但它是一个成熟的图书馆。

+0

+ 1 DataAbstract似乎支持开放数据协议(根据http://www.odata.org/producers)与服务器库的.NET,Mono(Linux &OS X)和Delphi。 – mjn 2012-02-02 09:08:01

+0

'即使您只有一个“托管点”,问题是什么?网络服务只是一个“网站”。 - 服务器不是我的,我正在为一个网站付费。另一个网站(如网络服务),我将不得不支付双重托管。我宁愿不深入细节。 +1没有更少。 – 2012-02-02 14:10:35

+0

除非有办法将Web服务*放在另一个站点的内部?就像一个只有接收/响应HTTP请求任务的页面一样? – 2012-02-02 14:15:14

1

“传统”方法之一是通过web服务(尽管现在有人认为这种技术有点过时)。

其中一个缺点是它不是可以绕过数据库的通用包装器,但它的优点是可以轻松限制对数据库的访问,例如,这将最大限度地提高安全性,并且是一种标准技术,如果你想提供有限的授权访问外部应用程序。

+0

+1,而且我之前也使用过这样的Web服务。但是,在这种特殊情况下,我只有1个托管点,1个数据库,并且对服务器的访问非常有限。否则,我其实会做到这一点。我将其添加为'第三'选项... – 2012-02-02 01:32:05

+0

+1为什么Web服务已过时?查看包括SAP在内的[许多供应商](http://www.odata.org/producers)使用的[开放数据协议](http://www.odata.org/)。微软,IBM – mjn 2012-02-02 07:07:47

+0

它应该说“过时”:) – 2012-02-02 08:54:47

1

如果您已经使用ASP.NET C#Web应用程序,则还可以将基于WCF (Windows Communication Foundation)的Web服务添加到您的网站。这可以提供对外部应用程序的数据库访问,这些应用程序需要以某种方式连接Web服务。甚至应该可以对普通网站页面和服务使用相同的HTTP标准端口,方法是将Web服务映射到特定的上下文路径,如www.example.com/services/servicename

1

Kbmw允许您创建一个ntier db架构。

但是因为你有涉及到Web应用程序,一个更好的选择是WCF(如已经建议)