2009-02-24 84 views
1

我有这个C#webform有一个日期选择器框。如果日期设置为空(默认),我希望它将NULL传递给数据库。这发生在我的参数化查询中。我的SQLParameter没有正确传递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:00 AM”,这本身就很痛苦。

我试图设置CMActionDate.Value为下列值无济于事(I得到相同的结果如上述。):

  • DBNull.Value;
  • “NULL”;
  • SqlDateTime.Null;
  • null;

帮助。

编辑

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

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

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

这有帮助吗?

+0

你做错了。再次阅读我的答案中的代码。它仍然归结于您试图使用像替代变量这样的参数,并且从C#代码的角度来看,情况并非如此。 – 2009-02-24 19:50:32

+0

请注意,在我的代码中,没有围绕@ActionDate的单引号,并且在查询中包含@ActionDate,只是字符串文字的另一部分。 – 2009-02-24 19:54:41

回答

13

您不应该看到“'或'空'。如果您使用参数化查询正确的应该是这样的:

UPDATE表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#代码中,任何时候你都无法查看查询字符串,并将数据替换为:将其单独发送到服务器。

由于在清理参数值时出错,这可以防止服务器执行参数值作为代码的任何可能性。数据是完全独立的,并且不需要首先对这种情况进行消毒。它还允许服务器缓存并重用查询的执行计划,从而实现(小)性能提升。

+0

看到我上面的编辑,我想我还不够清楚。 – somacore 2009-02-24 19:44:05

1

你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查询。

你的SQL应该从字面上:

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

应该有周围的变量没有字符串连接,他们不应该被包裹在引号。

0

您的查询绝对看起来不像发布的那些。

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

你需要像

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

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

相关问题