Я довольно новичок в SQL и пытаюсь найти лучший способ добавить некоторые предопределенные данные. Я выяснил, что здесь я должен был использовать параметризованную команду, чтобы избежать атаки на sql-инъекцию, которая в этом случае не вызывает большого беспокойства, но я бы хотел избежать этой возможности и научиться делать это правильно ... Во всяком случае, здесь код я прямо сейчас:Добавьте несколько значений SQL с тем же параметризованным запросом?
using (SqlTransaction trans = connection.BeginTransaction())
{
foreach (IEnumerable<string> row in table.RowData)
{
using (SqlCommand sql = new SqlCommand("INSERT INTO " + table.Title
+ " (" + string.Join(", ", table.Headers)
+ ") VALUES (" + string.Join(", ", table.Headers.Select(x => "@" + x)) + ");", connection, trans))
{
for (int i = 0; i < table.Headers.Count(); i++)
{
if (string.IsNullOrEmpty(row.ElementAt(i)))
{ sql.Parameters.AddWithValue("@" + table.Headers.ElementAt(i), DBNull.Value); }
else
{ sql.Parameters.AddWithValue("@" + table.Headers.ElementAt(i), row.ElementAt(i)); }
}
sql.ExecuteNonQuery();
}
}
trans.Commit();
}
Это похоже на работу, и все данные попадают туда, но это чувствует "неэффективным для меня. Я обертываю его в транзакцию, поэтому есть только одно коммит, но каждый раз он создает параметры и просто устанавливает разные значения для каждой строки.
Есть ли способ сделать это с использованием одних и тех же параметров, но просто установить разные значения в строке? Или это лучший способ сделать это, и я не должен беспокоиться об этом?
Заранее благодарим за любую помощь, которую вы можете дать.
объектов в C# дешевы. Может ли быть более эффективным? Возможно. Но вы не собираетесь получать много чего из этого, повторно используя параметр, и вы можете даже ввести некоторые тонкие ошибки, сделав это. Я советую против этого. – Amy
С дополнительным контекстом мы могли бы помочь лучше, потому что мы не знаем, должна ли эта оболочка быть повторно используемой оболочкой вокруг API SQL, конкретный запрос с множеством операторов и значений вставки, или что - ответ зависит. – Yushatak
Извините, что вам нужно сказать об этом, но это доступно для инъекционной атаки - вы объединяете переменные строки (table.Title) в свой запрос. – Hogan