簡體   English   中英

使用 Oledb、C#、Dapper 的條件表達式中的數據不匹配

[英]data mismatch in criteria expression using Oledb, C#, Dapper

我只是在表中使用 [c#, DAPPER, MS Access] 插入數據,但是 c# 中的 [DateTime] 列映射到 MsAccess 中的 [date/time] 列會導致諸如“條件表達式中的數據不匹配”之類的問題。

經過長時間的研究,我得到了一個鏈接,但“地板”解決方案在這里不起作用。 任何建議都是最受歡迎的。

我發現的最佳解決方案是將查詢字符串中的參數語法從@Foo?Foo? .

原因在https://github.com/StackExchange/Dapper/issues/911 中有解釋

試試這樣對我有用的東西:

@CLStart = DateTime.Parse(Convert.ToDateTime(client.CLStart).ToShortDateString())

client.CLStart這里的數據類型是DateTime? - 一個Nullable<DateTime>

當查詢具有多個參數時,我之前在將 SQL 查詢與 Dapper 和 MS Access 結合使用時遇到過這個問題。 問題是訪問引擎不尊重參數順序並按字母順序對它們進行排序。

以這個名為MyTable 的示例表為例:

MyNumber   Number
MyDate     Date/Time

假設您有一個 C# 類 MyClass:

public class MyClass
{
    public int MyNumber { get; set; }
    public DateTime MyDate { get; set; }
}

並有一個實例myClass ,您將其傳遞給以下 Dapper 語句:

connection.Execute("INSERT INTO MyTable (MyNumber, MyDate) VALUES (@MyNumber, @MyDate)", myClass);

由於System.Data.OleDb.OleDbException: '條件表達式中的數據類型不匹配,該語句將失敗。

這是因為 Access 將按字母順序對參數進行排序,在這種情況下,這會導致它嘗試將數字粘貼到日期中,並將日期粘貼到數字中。

您可以通過以字母友好的方式命名參數或按字母順序排列參數來解決此問題。 在這種情況下,上述語句可以改寫為:

connection.Execute("INSERT INTO MyTable (MyDate, MyNumber) VALUES (@MyDate, @MyNumber)", myClass);

我在 vb.net 中遇到了同樣的問題,我是這樣解決的。

 Public Shared Function dapperBugDate(ByVal birthday As Date)
        birthday = birthday.ToString("yyyy-MM-dd HH:mm:ss")
    Return birthday
End Function

Sub save()
    Dim actions = db.Execute("INSERT into table (birthday) VALUE (@birthday)", New table With {.birthday = dapperBugDate(Me.birthday)})
End Sub

將 DateTime 轉換為字符串對我有用。 例如,

using (var conn = new OleDbConnection(connectionString))
{
    conn.Open();
             
    string sql = "Insert into TableName (TableId, DateChanged) values (@TableId, @DateChanged);";
    var effectedRowCount = await conn.ExecuteAsync(sql, new { TableId = 1, DateChanged = DateTime.Now.ToString()});

    conn.Close()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM