检索使用DbConnection插入的最后一条记录

本文关键字:最后 一条 记录 插入 DbConnection 检索 | 更新日期: 2023-09-27 18:08:56

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

检索使用DbConnection插入的最后一条记录

我对此并不乐观。一些数据库提供了自动创建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,但这本身就是一组不同的问题,而且几乎已经过时了。