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

本文关键字:datetime 中将 字段 SQL 设置 NULL 则在 文本 如果 | 更新日期: 2023-09-27 18:17:49

如果文本框为空,试图将SQL表中的datetime字段设置为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服务器上的一个页面,仅供我使用,不向公众公布。

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

参数化

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

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

和把任何Parse等代码你想要的在调用者 -不是在db附近。现在我们需要实现它:

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
}

或者使用像"dapper"这样的工具:

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
}

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

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

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

  1. 你将EndDate设置为c# null。这与SQL NULL不同,后者表示为DBNull。值

  2. 你没有考虑到NULL在SQL中不需要引号的事实,所以即使你修复了#1,你的SQL也需要不同才能工作。

我建议写一个存储过程;如果结束日期文本框为null,则不要传递该参数,并使其在存储过程中具有默认值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#代码调用存储过程,并从您的文本框中向调用添加参数。

我认为错误是在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注入并考虑另一种方法。

您可以这样尝试:

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);