2011-09-17 72 views
1

我想創建一個數據訪問層,我可以與任何類型的SQL提供程序重用。我不想要的是有一個switch語句,它指定了獲取每個已知提供者的最後創建記錄的id的不同方式。 DbConnection是否提供了以通用方式訪問最後創建的記錄的ID的方法?檢索使用DbConnection插入的最後一條記錄 - C#

回答

2

我對此不會持樂觀態度。一些數據庫提供了創建ID值的自動化(例如SQL Server,MySQL)。儘管如此,連接並不會自動爲您提供價值;你必須要求它。在SQL Server中,

INSERT INTO FOO (...) VALUES(...); SELECT SCOPE_IDENTITY; 

Oracle甚至沒有標識列的概念。生成一個身份值意味着要麼取現有身份值的MAX + 1,要麼使用SEQUENCE和TRIGGER來添加身份值。無論哪種方式,您都必須將其全部包裝在一個事務中以保證正確性;對於SEQUENCE解決方案,您必須運行單獨的SELECT來獲取序列值(作爲事務的一部分)。您可能必須使用MAX + 1方法來做到這一點,但我沒有在任何應用程序中走這個方向,所以我不能說明確。具有自動化身份解決方案的數據庫不需要事務來包裝每個插入身份請求。

一般來說,數據庫傾向於支持SQL的方言,而不是一個單一的「標準」,並且它們在訪問方法上有所不同。試圖支持「共同子集」可能意味着你縮小了可能性太遠而無用。採用DbConnection,DbCommand等方法,您將僅限於在應用程序代碼中生成GUID,作爲擺脫身份列混亂的唯一選擇。

另一種解決方案是一個ORM,它將一個模型映射到一個底層(以及隱藏的)訪問層。實體框架試圖到達那裏,但由於EF與模型和連接字符串之間的相互依賴性,生成連接字符串是有問題的。 Codeplex上的IQToolkit項目採用了將LINQ映射到數據庫的另一種方法,但它仍然需要插件提供程序,它不僅提供獨特的連接實現,還提供SQL格式化程序和語言策略模塊,可將生成的SQL形成特定約束數據庫實現。

我對此的看法是,DbConnection是錯誤的地方去尋找一個地方開始你的共同點。確保你理解你需要支持的每個數據庫的怪癖 - 這意味着在開始將它們包裝在公共訪問層之前,你必須對它們進行編程。看看ORM足夠了解他們是如何工作的;他們所能提供的真正的共同點始於「給我一個帶有這個身份的推薦人記錄」,而不是「給我一個連接」。它們不僅隱藏連接和命令,還提供命令生成器,有時與數據庫提供者緊密合作。大多數結果都是作爲映射到表,模型或特定查詢的類(例如,基於LINQ)提供的。

如果您真的想隱藏應用程序其餘部分的數據庫細節,則必須隱藏所有內容。 ADO.NET中的抽象數據訪問類是不夠的。

或者你可以回到ODBC上,但除了幾乎已經過時,它本身就是一組不同的問題。

+0

我同意@Cylon,我將在您的未來看到switch語句。 –

+0

或代表。代表們提出更簡潔的代碼。 –

+0

謝謝Cyclon讓我的選擇真的很清楚。每次我想要支持一個新的數據庫時,我都必須添加特殊代碼。我也會花一些時間嘗試ORM – enamrik

相關問題