我正在使用C#和Microsoft.Jet.OLEDB.4.0提供程序将行插入Access mdb。
是的,我知道Access很糟糕。这是一个巨大的遗留应用程序,其他一切正常。
该表有一个自动编号列。我插入行,但自动编号列设置为零。
我用Google搜索了这个问题并阅读了有关此主题的所有文章。有人建议为自动编号列插入-1,但这不起作用。我找不到其他建议。
我正在使用OleDbParameter,而不是连接一个大的SQL文本字符串。
我尝试过使用和没有事务的插入。没有区别。
如何使此插入工作(即正确设置自动编号列内容)?
非常感谢,
Adam Leffert
答案 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中一样,您不会为标识列插入值。