我SQLParameter不过NULL正确
-
06-09-2019 - |
题
我有这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";
注意到没有字符串连接。