2015-05-29 6 views
0

Когда я запускаю следующий запрос, я получаю синтаксическую ошибку в выражении запроса.синтаксическая ошибка отсутствует оператор в выражении запроса

private void button8_Click(object sender, EventArgs e) 
{ 
    connection.Open(); 
    OleDbCommand command = new OleDbCommand(); 
    command.Connection = connection; 
    string query1 = "UPDATE Points SET PNTS = 
        (case when EmpName = '" + comboBox1.Text + 
        "' then '" + label15.Text + "' when EmpName = '" + 
        comboBox2.Text + "' then '" + label16.Text + 
        "' when EmpName = '" + comboBox3.Text + "' then '" + 
        label17.Text + "' end) WHERE EmpName in ('" + 
        comboBox1.Text + "', '" + comboBox2.Text + "', '" + 
        comboBox3.Text + "')"; 

    command.CommandText = query1; 
    command.ExecuteNonQuery(); 
    connection.Close(); 
} 

Ошибка:

Синтаксическая ошибка (отсутствующий оператор) в выражении запроса «(случай, когда EmpName = 'Sam', затем '5,6', когда EmpName = 'Shane', затем '1,6' когда EmpName = 'Mike' then '0.8' end) '.

+3

Ваш код делает большую ошибку для SQL-инъекции. –

+2

Какая база данных пытается обновить? Это определенно не похоже на SQL for Case/When в SQL Server. (Я бы настоятельно рекомендовал строить параметризованный SQL вместо того, чтобы напрямую строить SQL с использованием ввода ...) –

+6

Ваш код ** чрезвычайно ** уязвим для [SQL injection] (http://en.wikipedia.org/ wiki/SQL_injection). Ради ваших пользователей * пожалуйста * используйте [параметризованные запросы] (https://msdn.microsoft.com/en-us/library/yy6y35y8.aspx). –

ответ

1

У вас есть синтаксическая ошибка в вашем sql (ms Access не содержит выражения case). Перепишите исходную строку следующим образом:

string query1 = 
     "UPDATE Points SET PNTS = " 
    + "SWITCH (" 
     + " EmpName = '" + comboBox1.Text + "', '" + label15.Text + "'" 
     + ", EmpName = '" + comboBox2.Text + "', '" + label16.Text + "'" 
     + ", EmpName = '" + comboBox3.Text + "', '" + label17.Text + "'" 
     + ", true, ''" 
    + ")" 
    + " WHERE EmpName in ('" + comboBox1.Text + "', '" + comboBox2.Text + "', '" + comboBox3.Text + "')" 
; 

Чтобы противостоять риску SQL инъекций, рассмотреть возможность использования параметризованную SQL как некоторые commentors предложили:

OleDbParameter parameter; 

// The n-th generic placeholder in the sql string will be set to the n-th registered Parameter Value. 
// '12' represents the data size, adjustment may be needed (can possibly be dropped altogether) 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = comboBox1.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = label15.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = comboBox2.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = label16.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = comboBox3.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = label17.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = comboBox1.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = comboBox2.Text; 
parameter = command.Parameters.Add("@InputParm", OleDbType.VarChar, 12); 
parameter.Value = comboBox3.Text; 

string query1 = 
     "UPDATE Points SET PNTS = " 
    + "SWITCH (" 
     + " EmpName = ?, ?" 
     + " EmpName = ?, ?" 
     + " EmpName = ?, ?" 
     + ", true, ''" 
    + ")" 
    + " WHERE EmpName in (?, ?, ?)" 
; 

Caveat

код тестировался, полученных из документов.

+0

Спасибо большое! Сработало! – Rasika

+0

Как я могу добавить label15.Text, label16.Text и label17.Text значения в текущее значение базы данных и общее число? – Rasika

0

(случай, когда EmpName = 'Sam', затем '5,6' .....)

Вы не должны использовать цитаты для числового значения. Является ли «PNTS» в базе данных строкой? Если не попытаться удалить цитату для этих значений.

Смежные вопросы