Написание sql-запроса с использованием текстовой переменной
Хочу организовать автоматическое заполение textBox, через sql запрос. В переменную sql заносится исполняемый запрос, в textBox10 - гос номер авто, по которому находятся остальные данные автомобиля.
private void textBox10_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
string sql = "SELECT * FROM [avto] WHERE [gosN] = '"+ textBox10.ToString() + "'";
textBox7.Text = sql;
SqlCommand cmd = new SqlCommand(sql, sqlConnection);
SqlDataReader dataReader = null;
dataReader = cmd.ExecuteReader();
while (dataReader.Read())
{
textBox7.Text = (dataReader["tabN"].ToString());
textBox8.Text = (dataReader["marka_model"].ToString());
string date;
date = (dataReader["date_uchet"].ToString());
textBox9.Text = date.Substring(0, date.Length - 7);
}
}
}
В textBox7 для наглядности занес формируемый запрос. Результат textBox7: SELECT * FROM [avto] WHERE [gosN] = 'System.Windows.Forms.TextBox, Text: У072АВ99'
После нажатия Enter заполняется только textBox7 sql-запросом, далее код не выполняется.
Ответы (1 шт):
Что касается системного звука и как от него избавиться при нажатии некоторых клавиш и сочетаний в TextBox, читать тут
Далее исправляем запрос на рабочий и безопасный:
using (var con = new SqlConnection(connectionString))
{
con.Open();
string sql = "SELECT * FROM [avto] WHERE [gosN] = @param";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddWithValue("@param", textBox10.Text);
using (var dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
//что-то делаем с данными, если они есть
}
}
В данном случае вместо склейки строки из константного текста запроса и текста вводимого пользователем, используется строго константный запрос с параметром, значение которого указывается через свойства команды. Такой запрос безопасен с точки зрения sql-инъекций, т.к. пользовательский ввод не может быть интерпретирован как функциональная часть запроса независимо от его содержания.
Отдельно обращаю внимание на то, что создавать и открывать соединение с БД лучше непосредственно перед использованием. А вот закрывать его вручную не обязательно, можно просто указать в конструкторе ридера закрытие соединения после завершения его работы.