使用Microsoft.Jet.OLEDB.4.0将行从C#插入Access db,自动编号列设置为零

时间:2020-03-06 14:55:18  来源:igfitidea点击:

我正在使用Cand Microsoft.Jet.OLEDB.4.0提供程序将行插入到Access mdb中。

是的,我知道Access很烂。这是一个巨大的旧版应用程序,其他所有功能都可以正常运行。

该表具有一个自动编号列。我插入行,但是自动编号列设置为零。

我用谷歌搜索了这个问题,并阅读了有关该主题的所有文章。一个建议在自动编号列中插入-1,但这是行不通的。我找不到其他建议可行。

我使用的是OleDbParameter,而不是连接大的SQL文本字符串。

我试过插入,有无事务。没有不同。

如何使此插入内容起作用(即正确设置自动编号列的内容)?

首先十分感谢,

亚当·莱弗特(Adam Leffert)

解决方案

进行插入时,需要确保未为"自动编号"列指定值。就像在SQL Server中一样,我们不会在Identity列中插入值。

在Access中可以将显式值插入IDENTITY(也称为自动编号)列中。如果我们(或者中间件)正在将零值写入IDENTITY列,并且IDENTITY列上没有唯一的约束,那么可能可以解释这一点。

为了清楚起见,我们应该使用语法

INSERT INTO (<column list>) ...

并且列列表应省略IDENTITY列。 Jet SQL将允许我们省略整个列列表,但是隐式包括IDENTITY列。因此,我们应该使用INSERT INTO()语法来显式省略IDENTITY列。

在Access / Jet中,我们可以将显式值写入IDENTITY列,在这种情况下,显然不会自动生成该值。因此,请确保我们和中间件(ADO.NET等)都未明确将零值写入IDENTITY列。

BTW仅针对下表中的IDENTITY列将每秒自动生成零值INSERT:

CREATE Table Test1 
(
   ID INTEGER IDENTITY(0, -2147483648) NOT NULL, 
   data_col INTEGER
);