我正在创建一个基本的客户清单应用程序,将代码从使用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}
*/
考虑到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
做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句