我有这C#web窗口,已经有一个日期选择器箱。如果该日期定为什么(默认),我希望它通过NULL数据库。发生这种情况在我的参数化查询。

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

当我打开调试我看到日期的确实是","所以它进入的,如果声明,并将actiondate.值{Null}就像我觉得这是应该的。

然而。

当它然后去执行nonquery,我击的放大镜,看看这个:

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

我想看到的是这样的:

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

由于action_date从来没有真正得到落空,然后价值中的日期时间的领域将恢复为"01/01/1900 12:00:00"这是一个痛苦的本身。

我曾试图设置CMActionDate.值以下的价值没有效果(I获得相同的结果上。):

  • DBNull.值;
  • "NULL";
  • SqlDateTime.Null;
  • null;

帮助。

编辑

也许我没说清楚?是的,当然参数化查询看起来是这样的:

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

但是当我试这件事情在VS,我把一个断点的权利之前ExecuteNonQuery();所以我可以看到SQL它试图运行。它的存在,我看到的实际SQL和看到的位在哪里action_date=".

这是否有帮助吗?

有帮助吗?

解决方案

你不应该看到"或'Null'.如果你使用的参数化的查询正确的,它应该是这样的:

更新表格的设定[action_date]=@ActionDate其中[id]=@ID

整点 的参数化的查询是,实际的参数值 从来没有 取代直接进入query string.

你的查询码应该看看事情是这样的:

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#码你会永远能够查询串数据取代:它是发送给该服务器分开。

这可以防止任何可能性的服务执行一个参数值作为代码,因为一个错误的消毒你的参数值。数据是完全独立,并不需要被清理用于这方面在第一位。它还允许服务器,以缓和重复使用的执行计划的查询,从而在(小型)提高性能。

其他提示

你parametized查询应该显示

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 query.

你sql应该从字面上的是:

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

应该没有串联周围的变量,他们不应该被包裹在报价。

你的查询肯定看起来不像那些发布。

你@参数需要在你的串,以便能阅读是正确的。你看到ActionDate=",因为@ActionDate不存在,最有可能的。

你需要的东西喜欢

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

注意到没有字符串连接。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top