【问题标题】:What's wrong with these parameters?这些参数有什么问题?
【发布时间】:2010-11-16 00:29:50
【问题描述】:

我有一个包含 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);

简单多了,现在可以正常使用了。谢谢大家

【问题讨论】:

  • 能否请您显示 InsertQuery 的文本?
  • 是否有任何列的限制?
  • SourceID 有外来约束,但即使我删除它,错误仍然出现
  • 看起来是时候进行实验了:1) 以交互方式运行插入,使用相似的数据。 2) 从插入中删除所有可为空的列。

标签: c# ms-access oledb


【解决方案1】:

只需ask google,我想超过10000的点击量是相当可观的。你的论点“我不认为...”在你证明之前是无效的。

MSDN 是这么说的:

当 CommandType 设置为 Text 时,OLE DB.NET 提供程序不支持将参数传递给 SQL 语句或由 OleDbCommand 调用的存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE
CustomerID = ?

因此OleDbParameter对象添加到OleDbParameterCollection的顺序必须直接对应于命令文本中参数的问号占位符的位置。

【讨论】:

    【解决方案2】:

    问题是因为添加时参数顺序不同。

    例如,在您的注释行 (//adapter.InsertQuery...) 中,您有 DocID,然后是 RecievedDay...但是当您添加它们时,您首先添加 DocID,然后添加 SourceID。

    确保它们的顺序相同...这适用于 sql 语句或存储过程。

    这是因为 ADO.NET 在使用 OLEDB 提供程序时不支持命名参数,并且由于您连接到 Access DB,因此您实际上使用的是 OLEDB 提供程序...所以参数的顺序很重要。


    如果它们正常,但仍然无法正常工作,那么我认为这可能是DateTimes 的问题;
    在将其添加为参数之前尝试将其转换为字符串:

    cmd.Parameters.AddWithValue("@ReceivedDay", ReceivedDay.ToShortDateString());
    cmd.Parameters.AddWithValue("@DueDay", DueDay.ToShortDateString());
    

    还要确保日期格式为美国格式 (m/d/yyyy) 或 ISO 格式 (yyyy-mm-dd)

    【讨论】:

    • @Dreas: DocID 和 SourceID 是字符串,我认为没有必要将它们解析为整数!
    【解决方案3】:

    OleDb不支持命名参数,所以Dreas的回答是正确的。

    当您使用 OleDb 时,您必须按照它们在查询中出现的顺序添加参数,因为您给它们的名称不会被使用。

    【讨论】:

    • @Coops 我知道这很古老,但如果 CommandType 是 Text,则存在限制。其他 CommandType 枚举支持它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2013-11-06
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多