C# 如果Textbox为空,则在SQL中将datetime字段设置为空
如果文本框为空,尝试将SQL表中的datetime字段设置为NULL,我似乎无法使其正常工作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;
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最佳实践,但您仍有几个问题:
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);