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

Posted

技术标签:

【中文标题】使用 Microsoft.Jet.OLEDB.4.0 从 C# 将行插入 Access db,自动编号列设置为零【英文标题】:Insert rows into Access db from C# using Microsoft.Jet.OLEDB.4.0, autonumber column is set to zero 【发布时间】:2008-09-30 13:29:12 【问题描述】:

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

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

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

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

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

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

如何让这个插入工作(即正确设置自动编号列的内容)?

非常感谢,

亚当·莱弗特

【问题讨论】:

【参考方案1】:

在 Access 中,可以将显式值插入 IDENTITY(也称为 Automnumber)列。如果您(或您的中间件)将值零写入 IDENTITY 列并且 IDENTITY 列上没有唯一约束,那么这可能会解释它。

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

INSERT INTO (<column list>) ... 

并且列列表应该省略 IDENTITY 列。 Jet SQL 将允许您省略整个列列表,然后隐式包含 IDENTITY 列。因此,您应该使用 INSERT INTO () 语法显式省略 IDENTITY 列。

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

顺便说一句,下表中的 IDENTITY 列将每秒自动生成零值 INSERT:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于使用 Microsoft.Jet.OLEDB.4.0 从 C# 将行插入 Access db,自动编号列设置为零的主要内容,如果未能解决你的问题,请参考以下文章

将连接字符串从 Microsoft.Jet.OLEDB.4.0 转换为 Microsoft.ACE.OLEDB.12.0 提供程序

使用 microsoft.jet.oledb.4.0 从 paradox db 过滤日期字段

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

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

Microsoft.Jet.OLEDB.4.0 “找不到提供程序。它可能没有正确安装。”错误