Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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# 如果Textbox为空,则在SQL中将datetime字段设置为空_C#_Sql - Fatal编程技术网

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

C# 如果Textbox为空,则在SQL中将datetime字段设置为空,c#,sql,C#,Sql,如果文本框为空,尝试将SQL表中的datetime字段设置为NULL,我似乎无法使其正常工作 string EndDate = ""; if (String.IsNullOrEmpty(EndDateTxtBox.Text.Trim())) { EndDate = null; } else { EndDate = EndDateTxtBox.Text;

如果文本框为空,尝试将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服务器上的一个页面,仅供我使用,不向公众发布。这是为了帮助我跟踪个人信息。

我认为错误出现在
string.format行中。
。字符串部分不能包含换行符。请尝试以下方法之一:跟着

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

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

参数化。 首先,您应该将UI代码从数据库代码中移开,这样当它靠近数据库时,我们就可以正确键入数据。例如:

void UpdateDates(int id, DateTime startDate, DateTime? endDate) {...}
然后将您想要的
Parse
etc代码放在调用者处——不要靠近数据库。现在我们需要实现这一点:

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
}
或者使用“整洁”之类的工具:


听起来问题在于单引号。如果它是空的,那么你不应该有它们


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

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

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

  • 您根本不考虑NULL在SQL中不需要引号这一事实,因此即使您修复了#1,您的SQL仍然需要不同才能正常工作

  • 我建议编写一个存储过程;如果EndDate文本框为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 sql = String.Format(@"UPDATE Test SET StartDate={0}, 
                                         EndDate={1} WHERE ID = {2}",
                         (StartDateTxtBox.Text.Trim().Equals(string.Empty) ? StartDateTxtBox.Text:"NULL"), EndDate, id);
    

    让我们一起说:不要将用户输入连接到SQLOP中,这是一个提示,请查看您的帖子中SQL的格式。要么是您将其复制到帖子中弄糟了,要么是有点提示您的SQL语句严重错误。@MarcGravel,为什么您总是要成为理性的代言人?:D@kcray,则
    开始的列是什么格式e
    EndDate
    存储在中?请不要告诉我
    VARCHAR
    …这是一次巨大的学习经历,谢谢大家。请不要鼓励进一步的SQL注入可能性。@Michael,是的,SQL注入很重要。op应该尽快了解它,以及如何针对它进行编码。但我尝试了为了使我的回答符合op的专业水平,至少从他们的问题中可以看出。从noobie到专业处理安全问题,这是一个陡峭的学习曲线。我们如何知道这个应用程序的功能、运行位置、安全漏洞的后果等?仅供参考,如果有必要的话,t他是一个运行在内部网络上的网站,仅供我使用。我想我应该这样说。除了我之外,没有人可以访问它。@CharlesBretana,我完全理解你的立场,我没有否决你的答案,但我的立场是这样的。你可以练习如何玩。如果你编写一个本地应用程序,只供你使用,但允许SQL注入,然后你就可以编写其他应用程序了。此外,我不是我兄弟的守护者吗?我是不是应该把我兄弟带到一条更好的路上去,还是应该让他被车撞到?所以,正如我所说的,学究式不是这个词。@Michael,哈!我想我不同意你的观点。除非他/她问我,否则我不是我兄弟的守护者!但是,再说一次,说真的,如果你正在学习如何系鞋带,让PETA nut教你如何使用皮鞋是对动物的一种道德犯罪是没有帮助的。不要说这是一个荒谬的例子,它只是在同一个范围内走得更远。+1:当然,你必须提供一个更强有力的解决方案!你可以我很自豪!当我发布我的回复时,我没有看到迈克尔·佩雷诺德的回复,但他的回答正是我所指的。
    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
    
    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);