【问题标题】:Unexpected token when creating a string expression?创建字符串表达式时出现意外标记?
【发布时间】:2021-02-20 00:34:58
【问题描述】:

我有以下代码:

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

它告诉我

无效的表达式术语“

【问题讨论】:

  • 您的 strvalue 必须用单引号括起来。编辑:答案不完整。如果列名指向数据库中的文本字段,则它必须在单引号之间。如果是数值,则不需要。
  • cardColumn.Text() 的值是多少?另外,请注意SQL Injection
  • 我想指出,直接从某个输入字段添加文本的构造将存在安全风险。这种结构非常有可能进行 SQL 注入。
  • 使用像实体框架这样的 ORM。使处理数据库中的数据变得更加容易。
  • 还是要注意SQL注入的危险。如果有人输入“;delete * from tablename';”当程序有正确的权限时,表名中的所有行都将被删除。

标签: c# sql .net ado.net


【解决方案1】:

您需要注意避免这种字符串连接并且它容易受到 SQL 注入攻击,您应该始终使用parameterized queries 来避免SQL Injection 并消除错误,如下所示:

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/

【讨论】:

  • 请注意 AddWithValue()not recommended 并有其注意事项。应该改用.Add().Value
  • @41686d6564 谢谢,同意。我正在研究答案,已更新。
【解决方案2】:

再次输入该行时问题已解决。文本中一定有一些非 ASCII 字符,因为它现在运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多