2013-04-04 2 views
0

Это работает:Зачем использовать string.Format(), перерыв моего sql?

dynSQL = "SELECT * FROM inventory WHERE vendor_item = '" + VendorItem + "' "; 

... но это не делает:

dynSQL = string.Format("SELECT * FROM inventory WHERE vendor_item = {0}", VendorItem); 

Последние причины «не удается найти таблицу 0»

Это еще один пример попытки довольно код, сбивающий меня с седла и на трюм.

Включает ли предложение where arg в двойные кавычки, отмеченные внешними одинарными кавычками, на самом деле путь? Должен быть лучший способ (лучше, чем мой «лучший способ» (что отлично, за исключением того, что он не работает)).

+1

Ваш второй пример не включает одинарные кавычки вокруг {0}. Преднамеренное? –

+0

Я бы не подумал, что они понадобятся; если они есть, это была проблема. –

+0

Почему бы вам не подумать, что они понадобятся? Почему бы вам не опубликовать SQL, созданный из строки? Покажите нам, что «dynSQL» выглядит во втором случае, а не просто дает сообщение об ошибке, и мы увидим, имеет ли смысл, а? – ErikE

ответ

3

Существует лучший способ. Какой бы язык вы ни использовали (вы не указали - часть string.Format), несомненно, поддерживает параметризованное выполнение SQL. Остановите конкатенирование и вместо этого используйте параметры.

Например, in C# Entity Framework вы могли бы сделать что-то вроде этого:

string esqlQuery = @"SELECT * FROM inventory WHERE vendor_item = @vendoritem"; 

using (EntityCommand cmd = new EntityCommand(esqlQuery, conn)) { 
    EntityParameter vendoritem = new EntityParameter(); 
    vendoritem.ParameterName = "vendoritem"; 
    vendoritem.Value = VendorItem; 

    cmd.Parameters.Add(vendoritem); 
    // go on to execute it as shown in the above link 
} 

Путем создания команды и выполнения его, все это делается для вас: размещение параметров и форматирование, в том числе упаковка строки в одинарных кавычках и избежать одного цитирует или использует «NULL» для нулевого значения вместо «NULL».

Еще одно примечание: ваш второй фрагмент кода не имеет одинарных кавычек вокруг токена. Но даже если вы получите «работу», вы все еще восприимчивы к SQL-инъекции. Лучшей практикой является использование параметризованного SQL вместо этого.

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

  • Нет связанных вопросов^_^