2012-02-02 69 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(如已經建議)