创建字符串表达式时出现意外标记?

Posted

技术标签:

【中文标题】创建字符串表达式时出现意外标记?【英文标题】: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';”当程序有正确的权限时,表名中的所有行都将被删除。 【参考方案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 字符,因为它现在运行良好。

【讨论】:

以上是关于创建字符串表达式时出现意外标记?的主要内容,如果未能解决你的问题,请参考以下文章

从 React 向 GraphQL 服务器进行查询时出现意外错误 [重复]

带有电子的 Vue CLI - 使用本机模块时出现意外字符 (1:0)

Newtonsoft.Json.JsonSerializationException:'反序列化对象时出现意外标记:使用动态对象注释

语法错误:使用 renderToString(<RoutingContext ...renderProps /> 时出现意外标记 <

当列名包含撇号时出现“UcanaccessSQLException:意外标记”

在Javascript中播放音频时出现意外行为