AUTOINCREMENT 不适用于 OleDbCommand

Posted

技术标签:

【中文标题】AUTOINCREMENT 不适用于 OleDbCommand【英文标题】:AUTOINCREMENT does not work on OleDbCommand 【发布时间】:2011-01-25 02:50:41 【问题描述】:

我正在使用 OleDb 做 MS Access 数据库文件。这是sn-p:

OleDbCommand command = oleDbConnection.CreateCommand();

command.CommandText =
    "CREATE TABLE MyTable (" +
    "[Count] LONG NOT NULL PRIMARY KEY AUTOINCREMENT, " +
    "[TimeAndDateTested] TIMESTAMP NOT NULL, " +
    "[SerialNumber] VARCHAR(14) NOT NULL, " +
    "[TestResult] BIT NOT NULL)";                    

command.ExecuteNonQuery();

你知道有什么问题吗?谢谢。

【问题讨论】:

【参考方案1】:

在 Access 2003 中,此语句将创建我认为您想要的表结构。请注意,我将第一个字段的名称更改为 Kount,因为 Count 是 Access 中的保留字。您可以将名称括在方括号中以避免歧义,但我更愿意避免使用保留字作为对象名称。 TIMESTAMP 被认为是 DATETIME 的同义词。 VARCHAR 被认为是 TEXT 的同义词。 BIT 将为您提供 Access 调用 Yes/No 的字段类型。

CREATE TABLE MyTable2 (
Kount COUNTER CONSTRAINT pkey PRIMARY KEY,
TimeAndDateTested TIMESTAMP NOT NULL,
SerialNumber VARCHAR(14) NOT NULL,
TestResult BIT NOT NULL);

我为 Kount 分配了一个主键约束,并将该约束命名为“pkey”。主键约束隐含了 Not Null 和 unique,所以不需要单独指定。

【讨论】:

我不知道 TIMESTAMP 会解析为 DateTime。其余的,做得很好。 我认为 Jet/ACE DDL 使 TIMESTAMP 成为 DATETIME 的同义词是很奇怪的,因为无论如何他们都不是同一件事。我想关键是它会将含义降级为 Jet/ACE 支持的 TIMESTAMP 定义的一部分,但它是含义中最微不足道的部分,在我看来几乎没有用处。【参考方案2】:

我变了:

"[Count] LONG NOT NULL PRIMARY KEY AUTOINCREMENT, " +

与:

"[Count] IDENTITY NOT NULL PRIMARY KEY, " +

它成功了。

【讨论】:

有趣。 . .您使用的是 ac 2007 还是 2010?我还没有升级。但是,在 ac 2003 中,COUNTER 关键字对我有用,而 IDENTITY 失败了。很有趣,很抱歉给你带来了错误! 不,没关系。不管怎么说,还是要谢谢你。我使用的是 Access 2007,但我将其保存为 Access 2003 文件。我会在 2003 年检查它。谢谢大家。【参考方案3】:

当对 MS Access 使用 DDL 时,您希望使用 COUNTER 来指定一个自动递增的整数字段。

【讨论】:

不确定,但您也可能在使用 TIMESTAMP 时遇到问题。而是将 TimeAndDateTested 字段定义为 DateTime,并将默认值设置为 NOW() @XIVSOlutions:这不是时间戳字段,因为每次更改记录时它都不会更新。但是,在 A2010 中,可以实现表级数据宏来执行此操作(像触发器一样工作),但在任何先前版本的 Jet/ACE 中,在引擎级是不可能的(必须在应用程序级别)。 @XIVSolutions 你是怎么做到的?我将 AUTOINCREMENT 关键字更改为 COUNTER 并且“...语法错误”仍在标记。 A.您使用的是哪个版本的 Access? @David Fenton - 是的,可能是时候进入 ac 2010 了,但是在我掌握了 SQL Server 之后,我就不再使用它了。不过谢谢。他们给了我们表级的宏,对吧?现在,如果他们更新 JET/OLE 库使其能够在 64 位环境中工作,我们就会有所收获!

以上是关于AUTOINCREMENT 不适用于 OleDbCommand的主要内容,如果未能解决你的问题,请参考以下文章

AUTOINCREMENT 自动增量

在 Android 上为 SQLite 使用 AUTOINCREMENT 的开销是啥?

AutoIncrement无法设置的问题

AUTOINCREMENT 只允许在 INTEGER PRIMARY KEY 上使用 - android

Tensorflow - 多 GPU 不适用于模型(输入),也不适用于计算梯度

如何在不检查 MySQL 中的 AUTOINCREMENT 的情况下增加主键