gpt4 book ai didi

c# - 使用 DbConnection 检索最后插入的记录 - C#

转载 作者:搜寻专家 更新时间:2023-10-30 23:20:20 27 4
gpt4 key购买 nike

我想创建一个数据访问层,我可以重复使用任何类型的 SQL 提供程序。我不想要的是有一个 switch 语句,它指定不同的方法来获取每个已知提供者的最后创建记录的 id。 DbConnection 是否提供一种以通用方式访问最后创建的记录的 ID 的方法?

最佳答案

我对此并不乐观。一些数据库提供了创建 ID 值的自动化(例如 SQL Server、MySQL)。但是,连接不会自动将值返回给您;你必须要求它。在 SQL Server 中,

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

Oracle 甚至没有标识列的概念。生成标识值意味着要么取现有标识值的 MAX + 1,要么使用 SEQUENCE 和 TRIGGER 添加标识值。无论哪种方式,您都必须将其全部包装在一个事务中以保证正确性,并且对于 SEQUENCE 解决方案,您必须运行一个单独的 SELECT 来取回序列值(作为事务的一部分)。您可能也必须使用 MAX + 1 方法来做到这一点,但我在任何应用程序中都没有朝那个方向发展,所以我不能明确地说。具有自动身份解决方案的数据库不需要事务来包装每个 insert-with-identity-request。

一般来说,数据库倾向于支持 SQL 的方言,而不是单一的“标准”,而且它们在访问方法方面的差异更大。尝试支持“公共(public)子集”可能意味着您将可能性缩小得太多以至于无用。采用 DbConnection、DbCommand 等方法,您将仅限于在应用程序代码中生成 GUID,这是摆脱标识列困惑的唯一替代方法。

另一种解决方案是 ORM,它将模型映射到底层(且隐藏良好)的访问层。 Entity Framework 试图做到这一点,但由于 EF 在模型和连接字符串之间存在相互依赖性,因此生成连接字符串存在问题。 Codeplex 上的 IQToolkit 项目采用不同的方法将 LINQ 映射到数据库,但它仍然需要插件提供程序,不仅提供唯一的连接实现,还需要 SQL 格式化程序和语言策略模块,将生成的 SQL 调整为特定的约束数据库实现。

我对此的感觉是 DbConnection 是错误的地方去寻找一个地方开始你的共性。确保您了解您需要支持的每个数据库的怪癖——这意味着您必须非常熟练地对它们进行编程,然后再开始将它们包装在公共(public)访问层中。仔细研究 ORM 以了解它们的工作原理;他们可以提供的真正共性始于“给我一个具有此身份的推荐人记录”,而不是“给我一个联系”。它们不仅隐藏连接和命令,还提供命令生成器,有时与数据库提供商紧密合作。大多数以映射到表、模型或特定查询(例如,基于 LINQ)的类的形式提供结果。

如果您真的想对应用程序的其余部分隐藏数据库的详细信息,则必须隐藏所有内容。 ADO.NET 中的抽象数据访问类是不够的。

或者您可以求助于 ODBC,但这本身就是一组不同的问题,而且几乎已经过时了。

关于c# - 使用 DbConnection 检索最后插入的记录 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com