如果文本框为空,尝试将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服务器上的一个页面,仅供我使用,不会向公众投射。这是为了帮助我跟踪个人事物。
答案 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最佳实践,但您有几个问题:
您正在将EndDate设置为C#null。这与SQL NULL不同,后者表示为DBNull.Value
您不必考虑NULL在SQL中不需要引号的事实,因此即使您修复了#1,您的SQL仍然需要不同才能工作。
我建议写一个存储过程;如果结束日期文本框为空,则不要传递该参数,并使其在存储过程中具有默认值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);