使用 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”提供程序