我有一个datagridview。在该DGV中,第一柱是组合框柱。我想,当选择这个组合框值时,下一个fild将自动从数据库中填充。但是出现了错误。
没有给出一个或多个必需参数的值 OleDbDataReader dr1 = cmd1.ExecuteReader();
我发布了代码。请帮帮我。
OleDbConnection con = new OleDbConnection(conn);
con.Open();
for (int i = 0; i < dgv.Rows.Count; i++)
{
string query = "select Description from General where AccCode='" +
dgv.Rows[i].Cells[0].Value +
"' and conpanyID='" +
label1.Text + "'";
OleDbCommand cmd1 = new OleDbCommand(query, con);
//OleDbDataAdapter daBranchName = new OleDbDataAdapter(cmd);
OleDbDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
dgv.Rows[i].Cells[1].Value = dr1["Description"].ToString();
}
}
con.Close();
答案 0 :(得分:6)
此类字符串连接对 SQL Injection 攻击开放。
改为使用 parameterized queries 。
string query = "select [Description] from [General] where AccCode= ? and conpanyID= ?";
OleDbCommand cmd1 = new OleDbCommand(query, con);
cmd1.Parameters.AddWithValue("@acc", dgv.Rows[i].Cells[0].Value);
cmd1.Parameters.AddWithValue("@ID", label1.Text);
正如HansUp pointed,Description
和General
reserved keywords 。将它们与方括号一起使用,例如[Description]
和[General]
答案 1 :(得分:3)
根据建议,使用参数化查询。
就错误而言,我猜这个字段名称是错误的:
conpanyID=
应该是:
companyID=
答案 2 :(得分:2)
使用参数,否则会打开sql注入攻击。
string query = "select [Description] from General where AccCode=? and conpanyID=?";
现在你可以设置参数
cmd.Parameters.AddWithValue("@p1", val1);
cmd.Parameters.AddWithValue("@p2", val2);