使用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 );