如果文本框为空,则在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服务器上的一个页面,仅供我使用,不向公众公布。参数化
首先,您应该将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最佳实践的问题,但您有几个问题:
-
你将EndDate设置为c# null。这与SQL NULL不同,后者表示为DBNull。值
-
你没有考虑到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);