我只是在表中使用 [c#, DAPPER, MS Access] 插入数据,但是 c# 中的 [DateTime] 列映射到 MsAccess 中的 [date/time] 列会导致诸如“标准表达式中的数据不匹配”之类的问题。
经过长时间的研究,我得到了一个链接,但“地板”解决方案在这里不起作用。任何建议都非常受欢迎。
我只是在表中使用 [c#, DAPPER, MS Access] 插入数据,但是 c# 中的 [DateTime] 列映射到 MsAccess 中的 [date/time] 列会导致诸如“标准表达式中的数据不匹配”之类的问题。
经过长时间的研究,我得到了一个链接,但“地板”解决方案在这里不起作用。任何建议都非常受欢迎。
我找到的最佳解决方案是将查询字符串中的参数语法从@Foo
更改为?Foo?
。
其原因在https://github.com/StackExchange/Dapper/issues/911中进行了解释
将 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()
}
试试这样对我有用的东西:
@CLStart = DateTime.Parse(Convert.ToDateTime(client.CLStart).ToShortDateString())
client.CLStart
这是数据类型DateTime?
- aNullable<DateTime>
我在 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
当查询具有多个参数时,我之前在结合 Dapper 和 MS Access 编写 SQL 查询时遇到过这个问题。问题是访问引擎不尊重参数顺序并按字母顺序对它们进行排序。
以这个名为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);