[英]What's wrong with these parameters?
我有一个包含 7 个字段的 Access 文件:
DocID - text - primary
SourceID - text
ReceivedDay - Date/Time
Summary - text
DueDay - Date/Time
Person - text
Status - Yes/No
现在我想用以下代码更新这个文件:
const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\DocMan.mdb;Persist Security Info=True";
const string InsertQuery = "INSERT Into Docs(DocID,ReceivedDay,Summary,Person,DueDay,Status,SourceID) Values(@DocID,@ReceivedDay,@Summary,@Person,@DueDay,@Status,@SourceID)";
string DocID = textBox1.Text;
string SourceID = comboBox1.SelectedIndex.ToString();
DateTime ReceivedDay = dateTimePicker1.Value;
string Summary = richTextBox1.Text;
string Person = textBox2.Text;
DateTime DueDay = dateTimePicker2.Value;
bool Status = false;
OleDbConnection cnn = new OleDbConnection(ConnectionString);
cnn.Open();
OleDbCommand cmd = new OleDbCommand(InsertQuery, cnn);
cmd.Parameters.AddWithValue("@DocID", DocID);
cmd.Parameters.AddWithValue("@SourceID", SourceID);
cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay);
cmd.Parameters.AddWithValue("@Summary", Summary);
cmd.Parameters.AddWithValue("@Person", Person);
cmd.Parameters.AddWithValue("@DueDay", DueDay);
cmd.Parameters.AddWithValue("@Status", Status);
cmd.ExecuteNonQuery();
cnn.Close();
但我得到一个例外:
Data type mismatch in criteria expression.
我怎样才能解决这个问题?
编辑:我使用不同的方法修复了这个问题:
我构建了一个这样的查询:
INSERT INTO Docs
(DocID, SourceID, ReceivedDay, Summary, Person, DueDay, Status)
VALUES (?, ?, ?, ?, ?, ?, ?)
然后使用 TableAdapter 来调用它:
string DocID = textBox1.Text;
string SourceID = comboBox1.SelectedIndex.ToString();
DateTime ReceivedDay = dateTimePicker1.Value.Date;
string Summary = richTextBox1.Text;
string Person = textBox2.Text;
DateTime DueDay = dateTimePicker2.Value.Date;
bool Status = false;
DocManDataSetTableAdapters.DocsTableAdapter docsTableAdapter = new DocManDataSetTableAdapters.DocsTableAdapter();
docsTableAdapter.InsertQuery(DocID,SourceID,ReceivedDay,Summary,Person,DueDay,false);
更简单,现在工作正常。 谢谢你们
问题是因为添加参数时参数的顺序不同。
例如,在您的注释行 ( //adapter.InsertQuery...
) 中,您有DocID
,然后是RecievedDay
...但是当您添加它们时,您首先添加DocID
,然后添加SourceID
。
确保它们的顺序相同……这适用于 sql 语句或存储过程。
这是因为 ADO.NET 在使用 OLEDB 提供程序时不支持命名参数,并且由于您正在连接到 Access DB,因此您实际上是在使用 OLEDB 提供程序...所以参数的顺序很重要。
如果它们是有序的,但仍然无法正常工作,那么我认为这可能是DateTime
的问题;
在将其添加为参数之前尝试将其转换为字符串:
cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay.ToShortDateString());
cmd.Parameters.AddWithValue("@DueDay", DueDay.ToShortDateString());
并确保日期格式为美国格式 ( m/d/yyyy
) 或 ISO 格式 ( yyyy-mm-dd
)
OleDb 不支持命名参数,所以 Dreas 的回答是正确的。
当您使用 OleDb 时,您必须按照它们在查询中出现的顺序添加参数,因为您给它们的名称没有被使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.