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

时间:2008-09-30 13:29:13

标签: ms-jet-ace autonumber

我正在使用C#和Microsoft.Jet.OLEDB.4.0提供程序将行插入Access mdb。

是的,我知道Access很糟糕。这是一个巨大的遗留应用程序,其他一切正常。

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

我用Google搜索了这个问题并阅读了有关此主题的所有文章。有人建议为自动编号列插入-1,但这不起作用。我找不到其他建议。

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

我尝试过使用和没有事务的插入。没有区别。

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

非常感谢,

Adam Leffert

2 个答案:

答案 0 :(得分:2)

在Access中,可以将显式值INSERT到IDENTITY(a.k.a。自动编号)列中。如果您(或您的中间件)正在将值零写入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
);

答案 1 :(得分:0)

执行插入操作时,您需要确保没有为AutoNumber列指定值。就像在SQL Server中一样,您不会为标识列插入值。