使用Oledb, c#, Dapper的条件表达式中的数据不匹配

本文关键字:数据 不匹配 表达式 条件 Dapper 使用 Oledb | 更新日期: 2023-09-27 18:06:11

我只是在表内使用[c#, DAPPER, MS Access]插入数据,但c#中的[DateTime]列映射到MsAccess中的[日期/时间]列,导致"标准表达式中的数据不匹配"等问题。

经过长时间的研究,我得到了一个链接,但"地板"解决方案在这里不起作用。欢迎提出任何建议

使用Oledb, c#, Dapper的条件表达式中的数据不匹配

我发现最好的解决方案是将查询字符串中的参数语法从@Foo更改为?Foo?

原因见https://github.com/StackExchange/Dapper/issues/911

试试这样对我有用的东西:

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

这里的client.CLStart数据类型为DateTime? - a 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,该语句将失败。oledbexcexception: '数据类型不匹配的标准表达式。'

这是因为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()
}