Ошибка базы данных Access:: «Не задано значение для одного или нескольких обязательных параметров».

У меня есть datagridview. В этом DGV первый столбец представляет собой столбец со списком. Я хочу сделать, чтобы при выборе этого значения в поле со списком следующее поле автоматически заполнялось из базы данных. Но там показывает ошибку.

Не указано значение для одного или нескольких обязательных параметров 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();

person Animesh Ghosh    schedule 10.09.2013    source источник
comment
Это не может быть код, который вы выполняете при получении этой ошибки. Это просто невозможно. В запросе нет параметров.   -  person Mike Perrenoud    schedule 10.09.2013


Ответы (3)


Такого рода конкатенации строк открыты для атак SQL Injection.

Используйте вместо этого параметризованные запросы.

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 указанные, Description и General являются зарезервированными ключевыми словами. Используйте их с квадратными скобками, такими как [Description] и [General].

person Soner Gönül    schedule 10.09.2013
comment
Description — это зарезервированное слово. Заключите это имя в оператор SQL: SELECT [Description] FROM ... - person HansUp; 10.09.2013
comment
Также дважды проверьте conpanyID по сравнению с companyID, как предложил Ларс. - person HansUp; 10.09.2013
comment
Добро пожаловать, Сонер. Я сначала не заметил, но General тоже зарезервированное слово. Видимо, в данном случае это не создало проблем. - person HansUp; 10.09.2013

Как было предложено, используйте параметризованные запросы.

Что касается ошибки, я предполагаю, что это имя поля неверно:

conpanyID=

должно быть:

companyID=
person LarsTech    schedule 10.09.2013

Используйте параметры, иначе он откроется для атак SQL-инъекций.

string query = "select [Description] from General where AccCode=? and conpanyID=?";

теперь вы можете установить параметры

cmd.Parameters.AddWithValue("@p1", val1);
cmd.Parameters.AddWithValue("@p2", val2);
person Damith    schedule 10.09.2013
comment
@AnimeshGhosh у вас есть столбцы с именами AccCode и conpanyID в вашей таблице General? какие типы столбцов в базе данных для них? - person Damith; 10.09.2013
comment
@AnimeshGhosh используйте [] вместо Description в качестве моего обновленного ответа - person Damith; 10.09.2013