[英]Troubleshooting “Data type mismatch in criteria expression.” during MS Access Insert.Into
我正在创建一个基本的客户清单应用程序,将代码从使用SQL Server转换为使用MS Access(我不太了解)时,在尝试执行此操作时遇到“数据类型不匹配”错误基本插入。
我在这里研究了几个类似的问题,并仔细检查了msdn语法指南,但找不到我编写的脚本会产生该错误的原因。 我多次更改代码以尝试确保正确的数据类型(最后通过显式键入并在后面添加值来完成下面的内容)。 实际上,我什至将字符串带入并粘贴到MS Access(没有空格和双引号)中,并且似乎可以很好地使用给定的值。 在这一点上,我确实感到非常困惑,我想知道它是否可能是Oledb适配器的怪癖? 任何帮助,将不胜感激。 谢谢。
// SQL query defined elsewhere:
public static readonly string sqlAddCustomerNotes = "INSERT INTO CustomerNotes (Customer_ID, Notes, NotesDate) "
+ "VALUES(@Customer_ID, @Notes, @NotesDate);";
// end sql query
// data access function
public static void addNotes(int customerID, string notes, DateTime notesDate)
{
string query = Scripts.sqlAddCustomerNotes;
using (
OleDbCommand dbCommand = new OleDbCommand()
{
Connection = new OleDbConnection(ConnectionAccess.connString),
CommandType = CommandType.Text,
CommandText = query,
Parameters =
{
new OleDbParameter("@Customer_ID", OleDbType.Integer),
new OleDbParameter("@Notes", OleDbType.LongVarChar),
new OleDbParameter("@NotesDate", OleDbType.DBTimeStamp)
}
}) // end using parenthetical
{ // begin using scope
dbCommand.Parameters[0].Value = customerID;
dbCommand.Parameters[1].Value = notes;
dbCommand.Parameters[2].Value = notesDate;
foreach (OleDbParameter param in dbCommand.Parameters)
{ // replace ambiguous null values with explicit DBNulls.
if (param.Value == null)
{
param.Value = DBNull.Value;
}
}
dbCommand.Connection.Open();
int rowsAffected = dbCommand.ExecuteNonQuery();
dbCommand.Connection.Close();
Console.WriteLine($"Rows affected: {rowsAffected}");
}
} // end addCustomerNotes
/*
table "CustomerNotes" has the following columns:datatypes
CustomerNotes_ID: AutoNumber
Customer_ID: Number
Notes: Memo
NotesDate: Date/Time
CreateDate: Date/Time
test case (in code) was:
@Customer_ID = 5
@Notes = "customer might change last name to simpson."
@NotesDate = {6/26/2019 12:05:39 PM}
*/
它可能是一个日期 ,而不是一个时间戳 :
new OleDbParameter("@NotesDate", OleDbType.DBDate)
考虑到June7关于定界符的评论,似乎问题出在OleDbParameter
类型固有的某个问题上。 用SQL Server的术语来说,我确实希望使用DateTime
(而不是Date
),但是将其表示为DBTimeStamp
似乎会使Access无法识别它。
目前,我已将日期作为VarChar
发送,并允许Access对其进行转换,但是其内部引擎认为合适。 感觉/似乎是错误的,但实际上可以解决问题。
Parameters =
{
new OleDbParameter("@Customer_ID", OleDbType.Integer),
new OleDbParameter("@Notes", OleDbType.LongVarChar),
new OleDbParameter("@NotesDate", OleDbType.VarChar)
}
编辑 :刚刚看到June7的最新评论,实际上, 另一个线程中有一个答案。 OleDbType.DBDate
不能满足我的要求,但是OleDbType.Date
做到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.