Если вы ожидаете обновления строки, вы будете разочарованы. Важной особенностью использования параметризованного запроса является то, что значения никогда не подставляются непосредственно в командную строку, и, таким образом, вы защищены от такого рода уязвимости безопасности. Вместо этого данные передаются на сервер отдельно.
Позвольте мне предложить эту новую сигнатуру функции:
public string updateQuery(string table, IEnumerable<KeyValuePair<string, object>> values, KeyValuePair<string, object> condition)
Это создаст сильную связь между именами ваших параметров и значениями, а также даст вам гибкость в использовании конструкций, отличных от массива (хотя массив, безусловно, также будет принят). Тогда код будет выглядеть так:
public string updateQuery(string table, IEnumerable<KeyValuePair<string, object>> values, KeyValuePair<string, object> condition)
{
using (StringBuilder cmd = new StringBuilder("UPDATE [" + table + "]\nSET "))
{
string delimiter = "";
foreach (KeyValuePair<string, object> item in values)
{
cmd.AppendFormat("{0}[{1}]=@{1}", delimiter, item.Key);
delimiter = ",\n";
}
cmd.AppendFormat("\nWHERE [{0}]= @{0};", condition.Key);
command.CommandText = cmd.ToString();
}
foreach (KeyValuePair<string, object> item in values)
{
command.Parameters.AddWithValue("@" + item.Key, (object)item.Value ?? DBNull.Value);
}
command.Parameters.AddWithValue("@" + condition.Key, condition.Value);
// you didn't show where the connection was created or opened
command.ExecuteNonQuery();
connection.Close();
return command.CommandText;
}
Еще лучше, если вы можете использовать что-то, что будет создавать строго типизированные параметры базы данных (например, IEnumerable<SqlParameter>
).