#c# #sql #.net #ado.net
#c# #sql #.net #ado.net
Вопрос:
У меня есть следующий код:
public void UpdateCardSetColumn(CARD cardColumn, bool value, string cardId)
{
string strValue = value ? "1" : "0";
sql = $"UPDATE Card SET {cardColumn.Text()} = {strValue} WHERE CardGuid = '{cardId}'";
RunExecute(db2, sql);
}
Здесь ошибка '{cardId
И это говорит мне
Недопустимый термин выражения «
Комментарии:
1. Ваше strvalue должно быть в одинарных кавычках. РЕДАКТИРОВАТЬ: ответ не завершен. Если имя столбца указывает на текстовое поле в БД, оно должно быть заключено в одинарные кавычки. В случае числового значения это не требуется.
2. Какое значение
cardColumn.Text()
? Кроме того, остерегайтесь SQL-инъекций .3. Я хотел бы отметить, что ваша конструкция с добавлением текста непосредственно из некоторого поля ввода будет представлять угрозу безопасности. Внедрение SQL очень возможно с помощью этой конструкции.
4. Используйте ORM, подобный Entity Framework. Значительно упрощает работу с данными в базах данных.
5. Все еще помните об опасности SQL-инъекции. Если кто-то введет «;удалить * из имя_таблицы’;» в strValue, все строки в имя_таблицы будут удалены, если у программы есть правильные права для этого.
Ответ №1:
Вы должны знать, что такого рода конкатенация строк избегается, и она открыта для атаки SQL-инъекций, вы всегда должны использовать параметризованные запросы, чтобы избежать SQL-инъекций, а также избавиться от ошибок, что-то вроде этого:
sql = "UPDATE Card SET cardColumn = @strValue WHERE CardGuid = @cardId";
yourSqlCommand.Parameters.AddWithValue("@strValue ", cardColumn.Text);
yourSqlCommand.Parameters.AddWithValue("@cardId", cardId);
Хотя прямое указание типа и использование Value
свойства лучше, чем AddWithValue
:
yourSqlCommand.Parameters.Add("@cardId", SqlDbType.VarChar).Value = cardId;
Подробнее читайте здесь: https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already /
Комментарии:
1. Обратите внимание, что
AddWithValue()
это не рекомендуется и имеет свои предостережения..Add().Value
вместо этого следует использовать.2. @41686d6564 Спасибо, согласен. Я работал над ответом, обновлен.
Ответ №2:
Проблема была исправлена при повторном вводе строки. Должно быть, в тексте был какой-то символ, отличный от ascii, поскольку сейчас он работает хорошо.