[英]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.