我想創建一個數據訪問層,我可以與任何類型的SQL提供程序重用。我不想要的是有一個switch語句,它指定了獲取每個已知提供者的最後創建記錄的id的不同方式。 DbConnection是否提供了以通用方式訪問最後創建的記錄的ID的方法?檢索使用DbConnection插入的最後一條記錄 - C#
回答
我對此不會持樂觀態度。一些數據庫提供了創建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上,但除了幾乎已經過時,它本身就是一組不同的問題。
- 1. 檢索sql的最後一條記錄
- 2. 在mysql的下一條記錄中插入最後一條記錄字段
- 3. 插入跳過記錄集中的最後一條記錄
- 4. 檢索目標c中最後10條記錄的最大值
- 5. php檢索插入的最後一條記錄的ID,並將其插入到另一個表中
- 6. 插入後檢索記錄ID
- 7. MagicalRecord - 檢索最後插入的記錄id
- 8. 檢索最後插入記錄的ID在SQL Server CE 4
- 9. JPA Eclispelink - 無法檢索最後插入的記錄
- 10. 檢索過去7天當天的最後一條記錄
- 11. 檢索SQL Server表的最後一條記錄
- 12. MySQL的 - 檢索最後一條記錄在每個分組
- 13. 如何檢索mysql中的最後一條記錄?
- 14. SQL檢索sql查詢中的最後一條記錄
- 15. 獲取mysql最後插入ID,插入記錄後使用PDO
- 16. SqlAlchemy:獲取插入的最後一條記錄的ID
- 17. 從最後一個記錄檢索後從postgresql拉記錄
- 18. 插入一條新記錄(asp .net&c#)
- 19. Hive查詢獲取插入表中的最後一條記錄
- 20. sql server:我如何獲取插入的最後一條記錄?
- 21. 檢索最後一條記錄各組中沒有主鍵
- 22. 插入一條記錄
- 23. 如何刪除使用PDO插入到MySQL表中的最後一條記錄?
- 24. php sql while循環只插入最後一條記錄
- 25. 使用最後插入記錄的ID作爲一個外鍵
- 26. 一次插入多條記錄的MySQL
- 27. 查找最後插入的記錄 - Postgresql
- 28. PostgreSQL如何用一條插入語句插入多條記錄
- 29. 如何使用Java中的JPA檢索表中的最後2條記錄
- 30. 插入一條到多條記錄
我同意@Cylon,我將在您的未來看到switch語句。 –
或代表。代表們提出更簡潔的代碼。 –
謝謝Cyclon讓我的選擇真的很清楚。每次我想要支持一個新的數據庫時,我都必須添加特殊代碼。我也會花一些時間嘗試ORM – enamrik