我正在使用C#和Microsoft.Jet.OLEDB.4.0提供程序将行插入Access mdb。
是的,我知道访问很糟糕。 这是一个巨大的遗留应用程序,其他一切正常。
该表具有自动编号列。 我插入行,但自动编号列设置为零。
我在谷歌上搜索了这个问题,并阅读了我能找到的关于这个主题的所有文章。 有人建议为自动编号列插入 -1,但这不起作用。 我能找到的其他建议都没有奏效。
我使用的是OleDbParameter,而不是连接一个大的SQL文本字符串。
我已经尝试过有和没有交易的插入。 没有区别。
如何使此插入工作(即正确设置自动编号列内容)?
提前非常感谢,
亚当·莱弗特
在 Access 中,可以将显式值插入到 IDENTITY(又名 Automnumber)列中。如果您(或您的中间件)将值零写入 IDENTITY 列,并且 IDENTITY 列上没有唯一约束,那么这可能会解释它。
为了清楚起见,您应该使用语法
INSERT INTO (<column list>) ...
并且列列表应省略"标识"列。Jet SQL 将允许您省略整个列列表,但随后隐式包含 IDENTITY 列。因此,应使用 INSERT INTO () 语法显式省略 IDENTITY 列。
在 Access/Jet 中,您可以将显式值写入 IDENTITY 列,在这种情况下,该值显然不会自动生成。因此,请确保您和您的中间件(ADO.NET 等)没有显式将零值写入 IDENTITY 列。
顺便说一句,仅针对下表中的 IDENTITY 列将每秒插入一次自动生成值零:
CREATE Table Test1
(
ID INTEGER IDENTITY(0, -2147483648) NOT NULL,
data_col INTEGER
);
执行插入时,需要确保未为"自动编号"列指定值。 就像在 SQL Server 中一样,您不会为标识列插入值。