Неожиданный токен при создании строкового выражения?

#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, поскольку сейчас он работает хорошо.