Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的SQLParameter不是';不能正确地传递NULL_C#_.net_Sql_.net 2.0_Query Parameters - Fatal编程技术网

C# 我的SQLParameter不是';不能正确地传递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

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

不过

当它执行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