Могу ли я использовать параметры для команды sql? - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь создать общий код для построения запроса вставки / обновления. До сих пор я только создал запрос на обновление, но у меня есть сомнения относительно внедрения SQL.

Моя основная цель - попытаться создать код, чтобы сократить время повторного ввода одного и того же кода снова и снова.

public SqlConnection SqlConn;
private SqlCommand SqlComm;

public void UpdateRow(string TableName, string UpdateCondition, List<KeyValuePair<string, string>> FieldAndValueList)
{
  SqlOpen();
  try
  {
    string UpdateString = $"UPDATE {TableName} ";
    int counter = 0;
    foreach (KeyValuePair<string, string> FieldAndValue in FieldAndValueList)
    {
      if (counter > 0) { UpdateString += "," };
      UpdateString += $"SET {FieldAndValue.Key} = {FieldAndValue.Value} ";
      Counter += 1;
    }
    if (UpdateCondition.Trim() != "") { UpdateString += $"WHERE {UpdateCondition};"; }
    SqlComm = SqlConn.CreateCommand();
    SqlComm.CommandText = UpdateString;
    SqlComm.ExecuteNonQuery;
  }
  catch { ShowError(); }
  finally { SqlClose(); } 
}

Тогда это будет выполнено так:

List<KeyValuePair<string, string>> UpdateValues = new List<KeyValuePair<string, string>>;
UpdateValues.Add(new KeyValuePair<string, string>("age", txtAge.text)); 
UpdateRow("user", "user_id = X", UpdateValues);

Я пытаюсь создать его, чтобы SQL-инъекция была невозможна.

1 Ответ

3 голосов
/ 07 июня 2019

Я пытаюсь создать его, чтобы SQL-инъекция была невозможна.

Тогда вы должны использовать параметры; для отдельных полей будет работать что-то вроде следующего:

if (counter > 0) { sb.Append(","); }
var pName = "@p" + counter.ToString();
sb.Append("[").Append(FieldAndValue.Key).Append("]=").Append(pName);
cmd.Parameters.AddWithValue(pName, ((object)FieldAndValue.Value) ?? DBNull.Value);
Counter += 1;

где sb - это StringBuilder (чтобы избежать слишком большого количества конкатенаций строк)

Тем не менее! Ваш запланированный string UpdateCondition по своей сути не решаем. Что не может быть безопасным для инъекций. Вам нужно подумать о лучшем способе сделать это.

Или лучше: используйте любой готовый ORM.

...