繁体   English   中英

System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配。” C# 错误

[英]System.Data.OleDb.OleDbException: 'Data type mismatch in criteria expression.' C# error

这是一个普遍的问题。 我什至理解错误。 但到目前为止没有任何帮助。 为什么我收到 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配。” 错误。

private void DataWrite()
{
   connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + MyDataBase;
   connection = new OleDbConnection(connectionString);
   connection.Open();
   OleDbCommand cmd = new OleDbCommand();
   int testValue = 1;
   string values = "INSERT INTO DataTable (ID,Date,Measurement)\r\nVALUES ('" + testValue.ToString() + "','" + DateTime.Now + "','" + testValue.ToString() + "')";
   cmd = new OleDbCommand(values, connection);
   cmd.ExecuteNonQuery();
   connection.Close();
}


访问数据类型是 ID 是短文本,日期是日期/时间,测量是短文本

让我们正确执行此操作,使用 sql 中的参数:

private void DatenInDatenbankSchreibenKalibrierung()
{
   connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + MyDataBase;
   connection = new OleDbConnection(connectionString);
   connection.Open();
   OleDbCommand cmd = new OleDbCommand();
   int testValue = 1;
   string values = "INSERT INTO DataTable (ID,[Date],Measurement) VALUES (?,?,?)";
   cmd = new OleDbCommand(values, connection);
   cmd.Parameters.AddWithValue("p1", testValue);
   cmd.Parameters.AddWithValue("p2", DateTime.Now);
   cmd.Parameters.AddWithValue("p3", 1234);
   cmd.ExecuteNonQuery();
   connection.Close();
}

为什么我们总是使用参数

现在,对于侧面信息,还请阅读我们是否已经停止使用 AddWithValue - 这对于插入并不重要,并且 AddWithValue 便于在 SO 帖子中演示参数化,但生产系统 SELECTs 有改进(不使用访问也是一种改进)因为如果 AddWithValue 猜测类型错误,它可能会影响性能或数据精度

编写 SQL 时始终使用参数。 如果你认为你不能,因为也许你有一个数组中的值,你必须使用循环将这些值连接到 sql 中(例如); 不要连接值。完全有可能连接参数占位符并为数组中的每个值添加一个参数。 从不连接值,始终连接参数占位符


如果你想让你的数据库生活更轻松但仍然写 SQL,看看Dapper

使用 dapper 你的代码看起来更像:

using(var x = new OleDbConnection(...)){
  x.Execute("INSERT INTO DataTable (ID,[Date],Measurement) VALUES (?id?,?dt?,?ms?)",
    new { id = 1, dt = DateTime.Now, ms = 1234 }
  );
}

是的,就是这样,Dapper 将负责所有的连接打开、参数添加、类型猜测等,你需要做的就是在连接上执行查询并给它 sql 和一个匿名的 object,其属性的名称与参数名称匹配你把 sql

免责声明:我从未在 Access/ole 上使用 dapper 来执行此操作,我只是在模仿 Dapper 的作者的话

即使首选参数,也可以回答您的直接问题:

并非所有值都是 text

在这里,您似乎只有数字和日期值。 因此,对不同的数据类型使用正确的 SQL 语法,并且Date是保留字:

string values = "INSERT INTO DataTable (ID, [Date], Measurement)\r\nVALUES (" + testNumericId.ToString() + ", #" + DateTime.Now.ToString("yyyy'/'MM'/'dd") + "#, " + testNumericValue.ToString(System.Globalization.CultureInfo.InvariantCulture) + ")";

数字十进制值必须使用点作为小数分隔符转换为文本。

我认为问题来自日期转换。 通常,我在 SQL 语句中修复格式,如下所示:

string values = "INSERT INTO DataTable (ID,Date,Measurement)\r\nVALUES ('" + testValue.ToString() + "','" + DateTime.Now.ToString("yyyyMMddhhmmssfff") + "','" + testValue.ToString() + "')";

或者我更喜欢字符串插值:

string values = $"INSERT INTO DataTable (ID,Date,Measurement)\r\nVALUES ('{testValue}','{DateTime.Now:yyyyMMddhhmmssfff}','{testValue}')";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM