Как использовать строковую переменную в SQL-выражении - PullRequest
10 голосов
/ 01 сентября 2011

У меня есть приложение WPF, в котором я получаю

string someone = TextBox.text;

Я хотел бы использовать это в следующем запросе

query = " Select * From Table Where Title = someone "

Как мне использовать переменную кого-то в запросе?

Ответы [ 4 ]

20 голосов
/ 01 сентября 2011

Вы можете просто сделать это

query = "Select * From Table Where Title = " + someone;

Но это плохо и открывает для вас SQL-инъекцию

Вы должны просто использовать параметризованный запрос

Что-то вроде этого должноНачало работы

using (var cn = new SqlClient.SqlConnection(yourConnectionString))
using (var cmd = new SqlClient.SqlCommand())
{
   cn.Open();
   cmd.Connection = cn;
   cmd.CommandType = CommandType.Text;
   cmd.CommandText = "Select * From Table Where Title = @Title";
   cmd.Parameters.Add("@Title", someone);
}

Из ответа Джона Скита, поскольку он был более полным, чем мой

См. документы для SqlCommand.Parameters для получения дополнительной информации.

По сути, вы не должны встраивать свои значения в сам SQL по разным причинам:

  • Нелегко смешивать код и данные
  • Это открывает вам возможности для атак с использованием SQL-инъекций, если только выочень осторожны с экранированием
  • Вам нужно беспокоиться о форматировании и деталях i18n для таких вещей, как числа, даты и время и т. д.
  • Когда запрос остается неизменным, меняются только значения, оптимизатору него меньше работы - он может искать предыдущий оптимизированный запрос напрямую, поскольку он будет идеально соответствовать SQL.
13 голосов
/ 01 сентября 2011

Вы должны использовать параметризованный SQL-запрос:

query = "SELECT * From TableName WHERE Title = @Title";

command.Parameters.Add("@Title", SqlDbType.VarChar).Value = someone;

См. Документы для SqlCommand.Parameters для получения дополнительной информации.

Как правило, вы не должны вставлять своизначения в самом SQL по разным причинам:

  • Смешивать код и данные нелегко
  • Он открывает для вас атаки SQL-инъекций, если вы не очень осторожно, избегая экранирования
  • Вам нужно беспокоиться о форматировании и деталях i18n для таких вещей, как числа, даты, время и т. д.
  • Когда запрос остается тем же с изменением только значений, оптимизатор выполняет меньше работычтобы сделать - он может искать предыдущий оптимизированный запрос напрямую, поскольку он будет идеально соответствовать с точки зрения SQL.
2 голосов
/ 01 сентября 2011

Проще всего использовать подготовленный C # sql. Пример этого поста .Вам не нужно беспокоиться о экранировании символов в строке sql или чем-либо еще

1 голос
/ 06 марта 2018
declare @SqlQuery varchar(2000), @Fromdate varchar(20), @Todate varchar(20)

set @Fromdate='01 jan 2017'
set @Todate='30 mar 2017'


set @SqlQuery='select * from tblEmployee where tblEmployee.JDate between '''+ @Fromdate + ''' and '''+ @Todate+ ''''

print  @SqlQuery
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...