【问题标题】:Check if value exists or is null检查值是否存在或为空
【发布时间】:2014-08-05 22:24:13
【问题描述】:

一个问题...我在下面的示例中有一个代码...我必须将一些值插入数据库..但直接从数据行..我不想使用变量。所以我的问题是,有没有办法检查数据行中的值是否存在或是否为空,如果该值不存在我必须插入空或如果它为空,只需插入空...

例子:

myQuery = " INSERT INTO AGR3PL_CS (IDOC_NUM, PSEG_NUM, SEG_NUM, COMP01, GLNO01, NAME01) " +
          " VALUES (" + Lidoc_num + ", '" +
                        PSEG_NUM + "','" +
                        SEG_NUM + "','" +
                        dr_art_custsuply["Id"] + "','" +
                        dr_art_custsuply["GLN"] + "','" +
                        dr_art_custsuply["Name"] + "')";

这是我不想用的方式……

if (!dr_art_custsuply.Table.Columns.Contains("GLN") || dr_art_custsuply["GLN"].ToString().Length <= 0)
{
    gln = "";
}
else
{
    gln = dr_art_custsuply["GLN"].ToString();
}

【问题讨论】:

  • 不要这样写查询,改用parameters
  • 是的,我知道那不是正确的方法..但是在其他“插入”命令中,我有 50 个参数要插入...
  • @CrBruno 参数数量有什么区别,究竟是什么?不过,有一些工具可以帮助解决这个问题 - dapper 让参数化变得疯狂变得容易。如果有的话,拥有 50 个参数而不是 6 个只是意味着有 8 倍的理由来正确地做到这一点 - 如果你不这样做,有人会破坏你的系统的方式是 8 倍。
  • 即使忽略恶意用户,dr_art_custsuply["Name"] 包含单引号(例如,名为 O'Malley's Green Paint 的艺术品供应)是否不合理?不,将其转义存储并不是解决此问题的正确方法。

标签: c#


【解决方案1】:

简单地做

Convert.ToString(dr_art_custsuply["GLN"])

如果它有值,那么将发送该值。否则为 null,因为 Convert.ToString() 处理 null。

注意:不要做.ToString(),因为它会在值为空时抛出异常。
阅读Difference between Convert.ToString() and .ToString()

【讨论】:

    【解决方案2】:
    1. 参数
    2. DBNull.Value

    例如(因为您使用的是 oracle):

    cmd.CommandText = @"
    INSERT INTO AGR3PL_CS (IDOC_NUM, PSEG_NUM, SEG_NUM, COMP01, GLNO01, NAME01)
    VALUES (:IDOC_NUM, :PSEG_NUM, :SEG_NUM, :COMP01, :GLNO01, :NAME01)";
    cmd.Parameters.AddWithValue("IDOC_NUM", Lidoc_num);
    cmd.Parameters.AddWithValue("PSEG_NUM", PSEG_NUM);
    cmd.Parameters.AddWithValue("SEG_NUM", SEG_NUM);
    cmd.Parameters.AddWithValue("COMP01", dr_art_custsuply["Id"] ?? DBNull.Value);
    cmd.Parameters.AddWithValue("GLNO01", dr_art_custsuply["GLN"] ?? DBNull.Value);
    cmd.Parameters.AddWithValue("NAME01", dr_art_custsuply["Name"] ?? DBNull.Value);
    cmd.ExecuteNonQuery();
    

    或者如果您需要通过“dapper”获得帮助(因为您提到参数数量是个问题):

    connection.Execute(@"
    INSERT INTO AGR3PL_CS (IDOC_NUM, PSEG_NUM, SEG_NUM, COMP01, GLNO01, NAME01)
    VALUES (:Lidoc_num, :PSEG_NUM, :SEG_NUM, :Comp, :Gln, :Name)",
        new { Lidoc_num, PSEG_NUM, SEG_NUM,
            Comp = (int?)dr_art_custsuply["Id"],
            Gln = (string)dr_art_custsuply["GLN"],
            Name = (string)dr_art_custsuply["Name"] });
    

    【讨论】:

    • Hey Marc ..上面的例子 cmd.Parameter 就像一个魅力..所以如果我想做出 udate 它和插入一样吗?
    • @CrBruno 是的,基本上
    【解决方案3】:

    永远不要在 SQL 中插入值,而是使用 parameters/Bind 变量:

    using Oracle.DataAccess.Client; // <- In case of using Oracle 
    

    ...

    String myQuery = 
     @"insert into AGR3PL_CS(
         IDOC_NUM, 
         PSEG_NUM, 
         SEG_NUM, 
         COMP01, 
         GLNO01, 
         NAME01)
       values (
         :PRM_IDOC_NUM, -- <- Assuming that you use Oracle; @PRM_IDOC_NUM for MS SQL
         :PRM_PSEG_NUM, 
         :PRM_SEG_NUM, 
         :PRM_COMP01, 
         :PRM_GLNO01, 
         "PRM_NAME01)"; 
    
      ....
    
      using(OracleCommand cmd = new OracleCommand()) {
        ...
        cmd.CommandText = myQuery;
    
        // For MS SQL use
        // cmd.Parameters.AddWithValue("@PRM_IDOC_NUM", Lidoc_num); 
        cmd.Parameters.Add(":PRM_IDOC_NUM", Lidoc_num);
        cmd.Parameters.Add(":PRM_PSEG_NUM", PSEG_NUM);
        cmd.Parameters.Add(":PRM_SEG_NUM", SEG_NUM);
        cmd.Parameters.Add(":PRM_COMP01", dr_art_custsuply["Id"]);
        cmd.Parameters.Add(":PRM_GLNO01", dr_art_custsuply["GLN"]);
        cmd.Parameters.Add(":PRM_NAME01", dr_art_custsuply["Name"]);
    
        cmd.ExecuteNonQuery();
      }
    

    【讨论】:

    • 谢谢..我使用Oracle数据库
    【解决方案4】:

    您可以这样做(并将其用于大多数预期的类型):

    var customerId = (CheckNull(dr_art_custsuply["Id"], String.Empty)).ToString();
    
    
    public static object CheckNull(object value, object defaultValue)
    {
         return ((value == null || value == DBNull.Value) ? defaultValue : value);
    }
    

    【讨论】:

      【解决方案5】:

      使用内联三元运算符:

       gln = (!dr_art_custsuply.Table.Columns.Contains("GLN") || dr_art_custsuply["GLN"].ToString().Length <= 0 ?  string.Empty : dr_art_custsuply["GLN"].ToString());
      

      所以myQuery 变成:

      myQuery = " INSERT INTO AGR3PL_CS (IDOC_NUM, PSEG_NUM, SEG_NUM, COMP01, GLNO01, NAME01) " +
                " VALUES (" + Lidoc_num + ", '" +
                              PSEG_NUM + "','" +
                              SEG_NUM + "','" +
                              dr_art_custsuply["Id"] + "','" +
                              (!dr_art_custsuply.Table.Columns.Contains("GLN") || dr_art_custsuply["GLN"].ToString().Length <= 0 ?  string.Empty : dr_art_custsuply["GLN"].ToString()) + "','" +
                              dr_art_custsuply["Name"] + "')";
      

      编辑:回答您评论中的问题:

      myQuery = " INSERT INTO AGR3PL_CS (IDOC_NUM, PSEG_NUM, SEG_NUM, COMP01, GLNO01, NAME01) " +
                " VALUES (" + Lidoc_num + ", '" +
                              PSEG_NUM + "','" +
                              SEG_NUM + "','" +
                              dr_art_custsuply["Id"] + "','" +
                              (!dr_art_custsuply.Table.Columns.Contains("GLN") || dr_art_custsuply["GLN"].ToString().Length <= 0 ? 0 : dr_art_custsuply["GLN"].ToString()) + "','" +
                              (!dr_art_custsuply.Table.Columns.Contains("Name") || dr_art_custsuply["Name"].ToString().Length <= 0 ? String.Empty : dr_art_custsuply["Name"].ToString()) + "')";
      

      【讨论】:

      • 我试过这个例子,很好,但是如果某些值必须是数字,比如我想为 GLN 插入 0,为 Name 插入空字符串,该怎么写?
      • 谢谢@CrBruno!很高兴:)
      • 嗨戴安娜,一个问题?如何在此示例中使用内联三元运算符,我不想在插入期间使用变量,但我在代码中进行了一些转换... if (!dr_art_line. Table.Columns.Contains("WeightIssueUnit") || dr_art_line["WeightIssueUnit"].ToString().Length
      • WeightIssueUnit = (!dr_art_line.Table.Columns.Contains("WeightIssueUnit") || dr_art_line["WeightIssueUnit"].ToString().Length &lt;= 0) ? 0 : Convert.ToDecimal(dr_art_line["WeightIssueUnit"], CultureInfo.InvariantCulture); :)
      • 谢谢...我会尝试... :-) 哦,还有一个...在我插入数据库的过程中,我有这个 WeightIssueUnit.ToString().Replace(" ,", "."),这也可以像上面的例子一样合并吗? :-)
      猜你喜欢
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2017-12-26
      相关资源
      最近更新 更多