我的SQLParameter没有正确传递NULL

时间:2009-02-24 19:13:02

标签: c# .net sql .net-2.0 query-parameters

我有这个C#webform,它有一个日期选择器框。如果日期设置为空(默认值),我希望它将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},就像我认为的那样。

然而。

然后当它执行非查询时,我点击放大镜并看到:

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:00 AM”,这本身就很痛苦。

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

  • DBNull.Value;
  • “NULL”;
  • SqlDateTime.Null;
  • 空;

帮助。

修改

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

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

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

这有帮助吗?

3 个答案:

答案 0 :(得分:13)

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

  

UPDATE表SET [action_date] = @ActionDate WHERE [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();
}

此代码的结果是您的查询参数作为数据发送到服务器。在您的C#代码中,您将无法查看以下数据替换的查询字符串:它将单独发送到服务器。

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

答案 1 :(得分:1)

您的参数化查询应显示

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

参数值应该具有null等效值。

你的sql是

"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"

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

答案 2 :(得分:0)

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

你的@parameter需要在你的字符串中,以便正确阅读。你看到ActionDate =''因为@ActionDate不存在,很有可能。

你需要像

这样的东西
string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";

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