簡體   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