1

我有这个 C# 网络表单,它有一个日期选择器框。如果日期设置为空(默认值),我希望它将 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:00AM”,这本身就是一种痛苦。

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

  • DBNull.值;
  • “空值”;
  • SqlDateTime.Null;
  • 空值;

帮助。

编辑

可能我没说清楚?是的,参数化查询当然是这样的:

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

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

这有帮助吗?

4

3 回答 3

13

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

更新表 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# 代码中,您永远无法查看替换数据的查询字符串:它是单独发送到服务器的。

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

于 2009-02-24T19:22:53.567 回答
1

您的参数化查询应显示

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

并且参数值应该有一个空等效值。

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

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

于 2009-02-24T19:24:40.927 回答
0

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

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

你需要类似的东西

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

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

于 2009-02-24T19:51:40.767 回答