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

Pio*_*Pio 2 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这给了我"给出一个或多个必需的Parameteres没有值"错误.如果我尝试现在评论的行

command.Parameters.Add(new OleDbParameter("@ID", pair.Value));
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*sov 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;
Run Code Online (Sandbox Code Playgroud)