【问题标题】:String and ? : operators字符串和? : 运营商
【发布时间】:2013-10-01 09:28:26
【问题描述】:

我必须从字符串值构建查询字符串,例如:

connString += "INSERT INTO (...) VALUES ( "+

_cd.userName "," +

//and there i'd like to use ?: operators:

_cd.lastLogin == "Null" ? "null" : _cd.lastLogin "," 

所以我的查询看起来像INSERT INTO (...) VALUES ('name', null, (...))

但是当我使用它时,它会切断我的字符串,所以它看起来像

",null,1,2,'name', (...)";

好吧,我知道我可以使用 var a,b,c,d 然后检查是否(_cd.lastLogin == "Null) a = null 并将其放入字符串中,但是变量很多。

正确的使用方法是什么?

@编辑: 代码:

string query =  "INSERT INTO PersonLogin(...) " + Environment.NewLine +
 "VALUES (" + _cD.userID + ","
 + "'" + _cD.number + "',"
 + "'" + _cD.dateCreate + "','"
 + _cD.lastLogin == "Null" ? ",null," : _cD.lastLogin + "',"
 + _cD.taken + ","
 + _cD.canLogin + ""+ Environment.NewLine;

【问题讨论】:

  • 对不起,我忘了 - C#。
  • 正确的方法是使用SqlParameters。像这样构建你的查询是疯狂的。
  • 阿伦所说的。但要回答您的问题,可能会在 ? : 的所有用法周围加上括号。
  • 好的,但是 textCommand 会给我像 INSERT INTO (...) VALUES (@par1, @par2) 这样的查询,对吗?我需要创建带有查询的字符串(来自 10 多个表),然后将该字符串作为脚本发送并执行到另一台服务器的数据库中。
  • @user13657 SQL 客户端可能能够进行这样的一批操作。即使不是,我也会在同一个事务中分别发送命令。

标签: c# ternary-operator


【解决方案1】:

您可以使用 SqlParameter 并通过 DbNull.Value 设置值

插入 (...) 值 (@par1, @par2) command.Parameters.AddwithValue("@par1",DbNull.Value)

【讨论】:

  • 我知道我可以使用SqlParameters和Command。但正如我所说,我有 50 多个列的表,例如只有 20/50 为空。因此,使用此解决方案,我将需要执行类似 if(value == null) 的操作,然后添加 nullValue 否则添加 value.value
  • 您可以在 command.parameters 中循环,但这是一个糟糕的解决方案 OR + _cD.lastLogin == null ? ",null," : _cD.lastLogin + "',"
【解决方案2】:

进行查询的正确方法是不要使用字符串构建查询,而是使用 SqlParameters。这将使您的代码更具可读性,并且可以更好地防止 sql 注入。

【讨论】:

    【解决方案3】:

    ? 运算符的优先级低于 + 运算符。所以你需要把?和:的用法用括号括起来。

    connString += ... + (_cd.lastLogin == "Null" ? "null" :"'"+ _cd.lastLogin) +"'" ...;
    

    【讨论】:

    • -1 建议错误的实施方式。请参阅 msm2020 答案。
    • @AmitRanjan 我不是在暗示这个,我是想向 OP 展示他的错误。
    • 我将标记为解决方案,因为这是我的问题的答案,但是,正如你们所说的 - 我会尝试使用 SqlCommand 来完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2011-03-27
    相关资源
    最近更新 更多