![](/img/trans.png)
[英]System.Data.OleDb.OleDbException: 'Data type mismatch in criteria expression. in 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.