代码之家  ›  专栏  ›  技术社区  ›  somacore

我的SQLParameter未正确传递NULL

  •  1
  • somacore  · 技术社区  · 16 年前

    我有一个带有日期选择框的C#webform。如果日期设置为nothing(默认值),我希望它将NULL传递给数据库。这发生在我的参数化查询中。

    SqlParameter CMActionDate = new SqlParameter();
    CMActionDate.ParameterName = "@ActionDate";
    if (ActionDate.Equals(""))
      {
          CMActionDate.Value = System.Data.SqlTypes.SqlDateTime.Null;
      }
      else
      {
          CMActionDate.Value = ActionDate;
      }
    

    当我打开调试时,我看到日期确实是“”,因此它进入IF语句并将actiondate.value设置为{Null},就像我认为应该的那样。

    然而

    当它执行nonquery时,我单击放大镜并看到:

    UPDATE table SET [action_date] = '' WHERE [id] = 2488
    

    我想看到的是:

    UPDATE table SET [action_date] = 'Null' WHERE [id] = 2488
    

    由于action_date从未真正设置为NULL,因此datetime字段中的值将恢复为“01/01/1900 12:00:00AM”,这本身就是一个难题。

    我已尝试将CMActionDate.Value设置为以下值,但无效(我得到的结果与上面相同):

    • DBNull.Value;
    • SqlDateTime.Null;
    • 无效的

    编辑

    也许我不清楚?是的,当然参数化查询如下所示:

    "UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_id + "";
    

    但是当我在VS中调试这个东西时,我在ExecuteNonQuery()前面放了一个断点;所以我可以看到它试图运行的SQL。就是在那里,我看到了实际的SQL,看到了action_date=''的位置。

    这有用吗?

    3 回复  |  直到 16 年前
        1
  •  13
  •   Joel Coehoorn    16 年前

    您不应该看到“”或“Null”。如果正确使用参数化查询,则应如下所示:

    更新表集[action_date]=@ActionDate其中[id]=@id

    这个 参数化查询的实际参数值为 直接替换到查询字符串中。

    您的查询代码应该如下所示:

    string sql = "UPDATE table SET [action_date]= @ActionDate WHERE [id]= @CM_id";
    
    using (var cn = new SqlConnection("your connection string here."))
    using (var cmd = new SqlCommand(sql, cn))
    {
        cmd.Parameters.Add("@ActionDate", SqlDbTypes.DateTime).Value = 
             ActionDate.Equals("")? DBNull.Value : DateTime.Parse(ActionDate);
        cmd.Parameters.Add("@CM_id", SqlDbTypes.Int).Value = 2488;
    
        cn.Open();
        cmd.ExecuteNonQuery();
    }
    

    这可以防止服务器由于清除参数值时出错而将参数值作为代码执行。这些数据是完全独立的,并且不需要首先对该上下文进行清理。它还允许服务器缓存和重用查询的执行计划,从而(小)提高性能。

        2
  •  1
  •   cjk    16 年前

    您的参数化查询应该显示

    UPDATE table SET [action_date] = @ActionDate WHERE [id] = @id
    

    参数值应该有一个空的等价值。

    "UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' 
     WHERE [id] = " + @CM_id + "";
    

    这真的没有道理。您应该让sql替换@ActionDate和@CM_ID,而不是构建动态sql查询。

    您的sql应该是:

    String sql = "UPDATE table SET [action_date] = @ActionDate WHERE [id] = @CM_id"
    

    变量周围不应该有字符串连接,也不应该用引号括起来。

        3
  •  0
  •   AlexCuse    16 年前

    您的查询肯定与发布的查询不同。

    您的@参数需要在字符串中才能正确读取。您看到的ActionDate='',很可能是因为@ActionDate不存在。

    你需要像这样的东西

    string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";
    

    请注意,没有发生字符串连接。