Intereting Posts
Как параметризовать набор для оператора IN, используя встроенный SQL? Запустить приложение консоли C # из агента SQL Server (Job)? Команда SQL для удаления записи в текущих текстовых полях для приложения Java SQL Использовать значение столбца как ключевое слово в строке запроса Как выполнять массовое обновление просмотров? Как я могу выполнять логическую логику в двух столбцах в MySQL? Структура Entity обновляет один столбец, увеличивая текущее значение на единицу без выбора MySQL / InnoDB и длительные запросы ora-06553 pls-306 неправильное количество или типы аргументов при вызове 'ogc_x' SQL-Добавить значения в столбце Сложность времени запросов к базе данных MySQL: FULL OUTER JOIN – Как объединить один столбец? Есть ли время, когда использование отношения базы данных 1: 1 имеет смысл? Выберите из таблицы, зная только дату без времени (ORACLE) TSQL Pseudo Генератор случайных текстов

параметризованный sql-запрос – asp.net / c #

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

param1 = new SqlParameter(); param1.ParameterName = "@username"; param1.Value = username.Text; cmd = new SqlCommand(str, sqlConn); cmd.Parameters.Add(param1); //and so on 

Но проблема в том, что у меня есть более 14 переменных, которые нужно сохранить в db, как регистрационная форма. И это выглядело бы очень грязно, если бы мне пришлось писать эти строки 14 раз, чтобы параметризовать каждую переменную, есть ли более динамичный способ сделать это? например, используя цикл for или что-то и параметризуя каждую переменную в цикле?

заблаговременно за ваш ответ.

Использовать однострочный метод SqlParameterCollection.AddWithValue

 cmd.Parameters.AddWithValue("@username",username.Text); 

или другие варианты, которые вы можете попробовать

 command.Parameters.Add(new SqlParameter("Name", dogName)); 

Здесь вы идете … через dapper :

 connextion.Execute(sql, new { username = username.Text, id = 123, // theses are all invented, obviously foo = "abc", when = DateTime.UtcNow }); 

который сопоставляется с ExecuteNonQuery , но существуют и другие методы, такие как Query<T> (привязывает данные очень эффективно по имени к объектам типа T на строку), Query (например, Query<T> , но использует dynamic ), и несколько другие (привязка нескольких сеток или нескольких объектов и т. д.). Все смехотворно оптимизированы (мета-программирование на уровне IL) как можно быстрее.

Другой способ, вы можете использовать ..

 List<SqlParameter> lstPrm = new List<SqlParameter>(); lstPrm.Add(new SqlParameter("@pusername", usernameValue )); lstPrm.Add(new SqlParameter("@pID", someidValue)); lstPrm.Add(new SqlParameter("@pPassword", passwordValue)); 

Добавьте конец, в который вы можете выполнить итерацию, чтобы вставить параметры в свой command object

Используйте мой класс SqlBuilder. Он позволяет писать параметризованные запросы, не создавая ни одного параметра, или беспокоиться о том, что называется. Ваш код будет выглядеть так …

 var bldr = new SqlBuilder( myCommand ); bldr.Append("SELECT * FROM CUSTOMERS WHERE ID = ").Value(myId); //or bldr.Append("SELECT * FROM CUSTOMERS NAME LIKE ").FuzzyValue(myName); myCommand.CommandText = bldr.ToString(); 

Ваш код будет короче и гораздо читабельнее. По сравнению с конкатенированными запросами вам даже не нужны дополнительные строки. Класс, в котором вы нуждаетесь, здесь …

 using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; public class SqlBuilder { private StringBuilder _rq; private SqlCommand _cmd; private int _seq; public SqlBuilder(SqlCommand cmd) { _rq = new StringBuilder(); _cmd = cmd; _seq = 0; } public SqlBuilder Append(String str) { _rq.Append(str); return this; } public SqlBuilder Value(Object value) { string paramName = "@SqlBuilderParam" + _seq++; _rq.Append(paramName); _cmd.Parameters.AddWithValue(paramName, value); return this; } public SqlBuilder FuzzyValue(Object value) { string paramName = "@SqlBuilderParam" + _seq++; _rq.Append("'%' + " + paramName + " + '%'"); _cmd.Parameters.AddWithValue(paramName, value); return this; } public override string ToString() { return _rq.ToString(); } } 

Еще лучше, используйте мое блестящее новое расширение Visual Studio . Вы объявляете свои параметры в своем sql, неповрежденном в собственном файле. Мое расширение выполнит ваш запрос, когда вы сохраните файл, и сделаете для вас класс-оболочку для вызова во время выполнения и класс результатов для доступа к вашим результатам с помощью intellisense на всем протяжении. Вы увидите свои параметры sql в качестве аргументов методов Execute () класса wrapper. Вам никогда не придется писать еще одну строку кода параметра в C # или код читателя, или cmd, или даже соединение (если вы не хотите управлять этим самим). Ушли ушли ушли 🙂