如何正确使用参数化查询?

时间:2017-07-14 08:37:09

标签: c# oledbcommand

我现在已经连续工作了2个小时并阅读了很多问题,但是我无法看到我的OleDbCommand在哪里或为什么没有按照应有的方式工作。
我把这段代码写成了我见过的所有问题和答案的合并:

using (var connection = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;" + @"data source= *path to mdp*"))
{
  try
  {
    connection.Open();
    foreach (KeyValuePair<string, string> pair in dictionary)
    {
        string query = "SELECT * FROM mytable WHERE db_id=?";
        var command = new OleDbCommand(query, connection);
        //command.Parameters.Add(new OleDbParameter("@ID", pair.Value));
        command.Parameters.Add("?", OleDbType.BSTR).Value = pair.Value;
        var reader = command.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine(reader[0].ToString());
        }
        reader.Close();
    }
    connection.Close();
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
}

然而,这给了我“没有为一个或多个必需的Parameteres给出的值”错误。如果我尝试现在注释的行

command.Parameters.Add(new OleDbParameter("@ID", pair.Value));

并评论另一方,结果完全相同。
但是,如果我同时使用这两行,读者会读取我的表格列中的每个条目,而不仅仅是与pair.Value的所需匹配。

KeyValuePair只是一个字符串ID的元组,它来自我的程序作为一个键,它在数据库中的相应id作为值。

我很感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:5)

这对我有用:

string query = "SELECT * FROM mytable WHERE db_id=@ID";
var command = new OleDbCommand(query, connection);
command.Parameters.Add("@ID", OleDbType.BSTR);
command.Parameters[0].Value = pair.Value;

答案 1 :(得分:2)

仅供参考,您的代码是正确的,只需更改命令行参数并成功执行即可。

        string result = string.Empty;
        using (var connection = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;" + @"data source = employee.mdb"))
        {
            try
            {
                connection.Open();
                foreach (KeyValuePair<string, string> pair in dictionary)
                {
                    string query = "SELECT * FROM employeeTable WHERE ID=@id";
                    var command = new OleDbCommand(query, connection);
                    //command.Parameters.Add(new OleDbParameter("@ID", pair.Value));
                     command.Parameters.Add("@id", OleDbType.BSTR).Value = pair.Value;
                    var reader = command.ExecuteReader();
                    //result = reader.ToString();
                    while (reader.Read())
                    {
                        result += reader[1].ToString() + "\r\n";
                    }
                    reader.Close();
                }
                connection.Close();
            }
            catch (Exception ex)
            {
                Response.Write("Exception: " + ex.Message);
            }
        }