C# 我的SQLParameter不是';不能正确地传递NULL
我有一个带有日期选择框的C#webform。如果日期设置为nothing(默认值),我希望它将NULL传递给数据库。这发生在我的参数化查询中C# 我的SQLParameter不是';不能正确地传递NULL,c#,.net,sql,.net-2.0,query-parameters,C#,.net,Sql,.net 2.0,Query Parameters,我有一个带有日期选择框的C#webform。如果日期设置为nothing(默认值),我希望它将NULL传递给数据库。这发生在我的参数化查询中 SqlParameter CMActionDate = new SqlParameter(); CMActionDate.ParameterName = "@ActionDate"; if (ActionDate.Equals("")) { CMActionDate.Value = System.Data.SqlTypes.SqlDateT
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 + "";
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();
}
但是当我在VS中调试这个东西时,我在ExecuteNonQuery()前面放了一个断点;所以我可以看到它试图运行的SQL。就是在那里,我看到了实际的SQL,看到了action_date=''的位置
这有用吗?您不应该看到“”或“Null”。如果正确使用参数化查询,则应如下所示:
"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_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();
}
更新表集[action_date]=@ActionDate其中[id]=@id
参数化查询的要点在于,实际参数值永远不会直接替换到查询字符串中
您的查询代码应该如下所示:
"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_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#代码中,任何时候都无法查看替换了数据的查询字符串:它单独发送到服务器
这可以防止服务器由于清除参数值时出错而将参数值作为代码执行。这些数据是完全独立的,并且不需要首先对该上下文进行清理。它还允许服务器缓存和重用查询的执行计划,从而(小)提高性能。您不应该看到“”或“Null”。如果正确使用参数化查询,则应如下所示:
"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_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();
}
更新表集[action_date]=@ActionDate其中[id]=@id
参数化查询的要点在于,实际参数值永远不会直接替换到查询字符串中
您的查询代码应该如下所示:
"UPDATE CM_Codebase SET [action_date] = '" + @ActionDate + "' WHERE [id] = " + @CM_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#代码中,任何时候都无法查看替换了数据的查询字符串:它单独发送到服务器
这可以防止服务器由于清除参数值时出错而将参数值作为代码执行。这些数据是完全独立的,并且不需要首先对该上下文进行清理。它还允许服务器缓存和重用查询的执行计划,从而(小)提高性能。您的参数化查询应该显示
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"
变量周围不应该有字符串连接,也不应该用引号括起来。您的参数化查询应该显示
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"
变量周围不应该有字符串连接,也不应该用引号括起来。您的查询肯定不像发布的查询 您的@参数需要在字符串中才能正确读取。您看到的ActionDate='',很可能是因为@ActionDate不存在 你需要像这样的东西
string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";
请注意,没有发生字符串连接。您的查询肯定与发布的查询不同 您的@参数需要在字符串中才能正确读取。您看到的ActionDate='',很可能是因为@ActionDate不存在 你需要像这样的东西
string sql = "UPDATE CM_Codebase SET [action_date] = @ActionDate WHERE [id] = @CM_id";
请注意,没有发生字符串连接。为什么使用-1?我的答案与Joel的答案相同,但没有额外的代码。我为您将此项投票提高到0,但请参阅我上面的编辑以获得澄清。“我的答案与Joel的答案相同,但没有额外的代码”-是的,这正是我否决您的回答的原因。@Sean Bright:答案是同时编写的@Somacore:编辑制作。为什么是-1?我的答案与Joel的答案相同,但没有额外的代码。我为您将此项投票提高到0,但请参阅我上面的编辑以获得澄清。“我的答案与Joel的答案相同,但没有额外的代码”-是的,这正是我否决您的回答的原因。@Sean Bright:答案是同时编写的@Somacore:编辑制作。你做错了。再次通读我答案中的代码。归根结底,你还是要尝试使用一个参数,比如一个替换变量,而从C代码的角度来看,情况并非如此。请注意,在我的代码中,@ActionDate周围没有单引号,我将@ActionDate作为字符串文字的另一部分包含在查询中。你做错了。再次通读我答案中的代码。归根结底还是要使用一个参数,比如替换变量,而从C#代码的角度来看,情况并非如此。N