如何正确使用参数化查询?
How to use parameterized queries correctly?
我现在已经为此连续工作了 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);
}
}
然而,这给了我 "No Value given for one or more required Parameteres" 错误。如果我尝试现在注释的行
command.Parameters.Add(new OleDbParameter("@ID", pair.Value));
再评论另一个,结果完全一样。
但是,如果我同时使用这两行,reader 会读取但会给我 table 列中的每个条目,而不仅仅是与 pair.Value 的所需匹配。
KeyValuePair 只不过是一个元组,由我的程序中的字符串 id 作为键,其在数据库中的相应 id 作为值。
感谢任何帮助或建议。
这对我有用:
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;
仅供参考,您的代码是正确的,只需更改命令行参数即可成功执行。
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);
}
}
我现在已经为此连续工作了 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);
}
}
然而,这给了我 "No Value given for one or more required Parameteres" 错误。如果我尝试现在注释的行
command.Parameters.Add(new OleDbParameter("@ID", pair.Value));
再评论另一个,结果完全一样。
但是,如果我同时使用这两行,reader 会读取但会给我 table 列中的每个条目,而不仅仅是与 pair.Value 的所需匹配。
KeyValuePair 只不过是一个元组,由我的程序中的字符串 id 作为键,其在数据库中的相应 id 作为值。
感谢任何帮助或建议。
这对我有用:
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;
仅供参考,您的代码是正确的,只需更改命令行参数即可成功执行。
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);
}
}