如果Textbox为空,则在SQL中将datetime字段设置为NULL

时间:2013-06-10 15:11:33

标签: c# sql

如果文本框为空,尝试将SQL表中的日期时间字段设置为NULL,我似乎无法使其工作。

        string EndDate = "";
        if (String.IsNullOrEmpty(EndDateTxtBox.Text.Trim()))
        {
            EndDate = null;
        }
        else
        {
            EndDate = EndDateTxtBox.Text;
        }

        var sql = String.Format(@"UPDATE Test SET StartDate='{0}', 
                                 EndDate='{1}' WHERE ID = '{2}'",
                                 StartDateTxtBox.Text, EndDate, id);

当我这样做并提出一个断点时,我得到了“var sql”:

"UPDATE Test SET StartDate='5/23/2013', EndDate=" WHERE ID = '19'"

我尝试从sql字符串中删除'但是也没有用。有什么建议吗?

编辑:我理解防止SQL注入的重要性,但这是我内部Web服务器上的一个页面,仅供我使用,不会向公众投射。这是为了帮助我跟踪个人事物。

5 个答案:

答案 0 :(得分:12)

参数化。

首先,您应该将UI代码从数据库代码中移开,这样当它到达数据库附近时,我们就能正确输入数据。例如:

void UpdateDates(int id, DateTime startDate, DateTime? endDate) {...}

并将您希望Parse等代码放入调用者 - 不在数据库附近。现在我们需要实现它:

void UpdateDates(int id, DateTime startDate, DateTime? endDate) {
    //... where-ever cmd comes from, etc
    cmd.CommandText =
        "update Test set StartDate=@start, EndDate=@end where ID = @id";
    cmd.Parameters.AddWithValue("id", id);
    cmd.Parameters.AddWithValue("start", startDate);
    cmd.Parameters.AddWithValue("end", (object)endDate ?? DBNull.Value);
    cmd.ExecuteNonQuery();
    // ... cleanup etc
}

或者像“小巧玲珑”这样的工具:

void UpdateDates(int id, DateTime startDate, EndDate? endDate) {
    //... where-ever connection comes from, etc
    connection.Execute(
        "update Test set StartDate=@start, EndDate=@end where ID = @id",
        new { id, start = startDate, end = endDate}); // painfully easy
    // ... cleanup etc
}

答案 1 :(得分:1)

听起来问题是单引号。如果它是NULL,那么你不应该拥有它们。

此外,您可能希望使用参数化查询(出于安全原因并传入值)。在这种情况下,引号也不是必需的。

答案 2 :(得分:0)

我认为错误发生在string.format line。你不能在字符串部分包含换行符。请尝试以下方法之一。

 var sql = String.Format(
          @"UPDATE Test SET StartDate='{0}', EndDate='{1}' WHERE ID = '{2}'",
           StartDateTxtBox.Text, EndDate, id);

,或者

    var sql = String.Format(@"UPDATE Test SET StartDate='{0}', " + 
                             "EndDate='{1}' WHERE ID = '{2}'",
                             StartDateTxtBox.Text, EndDate, id);

但是,正如其他答案所提到的那样,您应该了解SQL注入并考虑另一种方法。

答案 3 :(得分:0)

尽管您的代码中的问题在C#代码中不被视为SQL最佳实践,但您有几个问题:

  1. 您正在将EndDate设置为C#null。这与SQL NULL不同,后者表示为DBNull.Value

  2. 您不必考虑NULL在SQL中不需要引号的事实,因此即使您修复了#1,您的SQL仍然需要不同才能工作。

  3. 我建议写一个存储过程;如果结束日期文本框为空,则不要传递该参数,并使其在存储过程中具有默认值NULL。

    Create Procedure usp_TestDateRange_Update
    ( @ID int -- or whatever type your ID is
      @StartDate DateTime,
      @EndDate DateTime = NULL)
    As 
      Update Test
      Set StartDate = @StartDate,
          EndDate = @EndDate
      Where ID = @ID
    

    这样的事情。现在你需要做的是让你的C#代码调用存储过程并将参数添加到文本框中的调用中。

答案 4 :(得分:0)

您可以尝试这种方式:

string sql = String.Format(@"UPDATE Test SET StartDate={0}, 
                                     EndDate={1} WHERE ID = {2}",
                     (StartDateTxtBox.Text.Trim().Equals(string.Empty) ? StartDateTxtBox.Text:"NULL"), EndDate, id);