【问题标题】:C# Insert Into Access Throwing ExceptionC#插入访问抛出异常
【发布时间】:2017-09-30 10:06:18
【问题描述】:

我有插入 Access 数据库的代码。

这段代码通常可以工作,但我有一个表不工作,我不明白为什么。

这是我得到的例外:

Syntax error in INSERT INTO statement.

这是代码:

if (connection == null) Connect();
command = new OleDbCommand(SQL);
command.Connection = connection;

try
{
    connection.Open();
    command.ExecuteNonQuery();
}
catch (Exception ex) { }
finally { connection.Close(); }

这是 SQL 字符串:

Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, dateTime, info) VALUES(1, 0, #02/05/2017 21:37:00#, '')

这是 TrackingsDateTimes 表:

trackingDateTimeID Number
trackingID Number
dateTime Date/Time
info Text

我错过了什么?

谢谢,

【问题讨论】:

  • 日期必须用单引号...
  • @Gusman 在 Access 中,这不是真的。 Access 中的日期文字可以用八字形 (#) 括起来。
  • 为了将来参考,请将查询粘贴到 Access 查询设计器中并从那里进行调试。

标签: c# sql database ms-access oledb


【解决方案1】:

将列命名为保留关键字并不是一个好主意。

DATETIME is reserved

如果您真的想使用该名称(我建议更改它),那么您需要在该名称周围加上方括号

Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, [dateTime], info) VALUES (.....)

【讨论】:

  • 谢谢,不知道!
【解决方案2】:

首先你应该使用参数化查询而不是内联插入变量。另一件事是 dateTime 是 MS Access 中的保留字,可能需要用 反引号 [ReservedWord] 进行转义。

这将为您重写查询提供一个良好的开端

// string qry = "Insert INTO TrackingsDateTimes ( trackingDateTimeID, trackingID, `dateTime`, info) VALUES(@trackingDateTimeID, #trackingID, @dateTime, @info)"
string qry = "Insert INTO TrackingsDateTimes ( trackingDateTimeID, trackingID, [dateTime], info) VALUES(@trackingDateTimeID, #trackingID, @dateTime, @info)"

if (connection == null) Connect();
command = new OleDbCommand(SQL);
command.Connection = connection;
command.Parameters.AddWithValue("@trackingDateTimeID", (int)1);
command.Parameters.AddWithValue("@trackingID", (int)0);
command.Parameters.AddWithValue("@dateTime", DateTime.Parse("2/05/2017 21:37:00");
command.Parameters.AddWithValue("@info", string.Empty);

【讨论】:

  • 虽然我同意参数概念(尽管这里的海报使用常量值),但反引号是访问的语法错误。
【解决方案3】:

您正在尝试插入用 # 而不是单引号括起来的日期。

用这个替换

Insert INTO TrackingsDateTimes (trackingDateTimeID, trackingID, dateTime, info) VALUES(1, 0, '#02/05/2017 21:37:00#', '')

编辑:我错了,史蒂夫是对的。

【讨论】:

  • 这将给出 类型不匹配错误 Access 接受常量 DateTime,在日期前后带有 #,格式为 MM/dd/yyyy
  • @Steve 我没有意识到这是 Access 中的要求,只使用过 T-SQL
  • 恒定的日期时间值?是的。这是始终使用参数的另一个原因
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 2018-05-19
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多