2009-12-12 3 views
3

В моем коде я это вездеЛегкий способ избежать строк sql?

command.Parameters.Add("@name", DbType.String).Value = name; 

Есть ли более простой способ? Я хотел бы сделать что-то вроде

command.command.CommandTextFn("insert into tbl(key,val) values(?, ?);", key, value); 

и выяснить, если ключ/значение является строкой или int. Я бы не возражал, если бы мне пришлось использовать {0} вместо ?

+11

Не делайте этого! Это открывает вам атаки SQL-инъекций! –

+5

способ, которым вы уже пользуетесь, является probobly самым приятным ... – Mickel

+3

Я не думаю, что он хочет использовать непараметризированные запросы, просто более простой способ их построить. – tvanfosson

ответ

13

Используйте AddWithValue метод:

command.Parameters.AddWithValue("@name", name); 

Вы можете использовать это в сочетании с методом расширения:

public static SqlCommand CreateCommand(this SqlConnection connection, string command, string[] names, object[] values) 
{ 
    if (names.Length != values.Length) 
    { 
      throw new ArgumentException("name/value mismatch"); 
    } 

    var cmd = connection.CreateCommand(); 
    cmd.CommandText = command; 
    for (int i = 0; i < names.Length; ++i) 
    { 
     cmd.Parameters.AddWithValue(names[i], values[i]); 
    } 

    return cmd; 
} 

используется в качестве

var command = connection.CreateCommand("insert into tbl (key,val) values(@key,@val)", 
             new string[] { "@key", "@val" }, 
             new object[] { key, val }); 
+0

У вас там опечатка, это должны быть 'names [i], значения [i]' (не могут редактировать из-за ограничения 6 символов chars min) – jgillich

4

Использование параметризованных запросов защищает вашу систему от атак SQL-инъекций.

Конечно, вы можете справиться с SQL-экранированием, но зачем беспокоиться? Вы можете сделать ошибку и просто обнаружить ее, когда ее слишком поздно.

Пожалуйста, прочтите this article, поскольку он объясняет плюсы и минусы, используя параметризованные запросы.

Инвестируйте свое время в улучшение других частей кода.

4

Вы делаете правильную вещь - с использованием параметров является лучшим решением как для повторного использования кода и для защиты от атак с внедрением SQL .. Это не сломалось, так что не исправить!

Если действительно ошибок (а это не должно), то вы, вероятно, могли бы сделать что-то творческое с помощью метода расширения, чтобы вы могли обернуть этот бит кода чем-то немного меньшим, но на самом деле есть лучшие вещи беспокоиться о.

0

Try заменить такие вызовы с помощью LINQ к sql. Вы получите проверку типов во время компиляции, и вам больше не понадобится избегать строк и думать о SQL-инъекциях.

образец:

Dim newCustomer = New Customer With {.CustomerID = "MCSFT", .CompanyName = "Microsoft", .ContactName = "John Doe", .ContactTitle = "Sales Manager", .Address = "1 Microsoft Way", .City = "Redmond", .Region = "WA", .PostalCode = "98052", .Country = "USA", .Phone = "(425) 555-1234", .Fax = Nothing} 
db.Customers.Add(newCustomer) 
db.SubmitChanges() 
2

Создать набор общих функций, которые принимают имя параметра и его значение. Оберните и спрячьте весь свой шаблонный код.

+0

В конце концов я сделал это с помощью принятого кода. +1 – 2010-07-09 21:00:15

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