如何解决使用日期值构建 SelectCommand
我正在 ASP.NET/C# WebForms 中构建查询。查询依赖于一系列 if 语句,如下所示:
//start building the query,I know SID will always be defined:
string firstpart = "SELECT * FROM [ExampleTable] WHERE StudentID= @SID";
//the variable student name is a URL variable. All the other URL variables follow this logic,9 potential variables in total,so 9 if statements in total.
if (studentname != "") {
dsResults.SelectParameters.Add("sname",studentname.ToString());
secondpart = " AND UPPER(StudentName) LIKE UPPER('%' + @sname+ '%')";
}
else{
//if URL variable is empty,simply make the string empty so it is ignored.
secondpart = "";
}
最后,我将它们全部添加到我用来构建查询的字符串中:
entirecommand = firstpart + secondpart + thirdpart + fourthpart + fifthpart + sixthpart + seventhpart + eighthpart + ninthpart + " ORDER BY [StudentID]";
最后,我设置了
dsResults.SelectCommand = entirecommand;
执行查询,结果数据绑定到gridview如下:
if (!Page.IsPostBack){
//bind the gridview data
gvResults.DataSource = dsResults;
gvResults.DataBind();
}
一切都运行得很完美,直到我尝试向查询添加日期
if (sSDate != ""){
dsResults.SelectParameters.Add("startdate",sSDate.ToString());
ninthpart = " AND DateEntered > '%' + @startdate + '%'";
}
当我尝试此操作时,我收到错误消息“从字符串转换日期和/或时间时转换失败。”上线了:
gvResults.DataBind();
我将日期部分设为第九部分,所以直到最后才添加。正如我所说,如果没有将第九部分添加到字符串中,一切都会按预期工作。
作为记录,我的日期在 URL 中采用以下格式:yyyy-mm-dd。只查找大于该日期的日期,根本不关心时间。
我真的不知道用这个去哪里,所以如果有人有什么建议,请告诉我。我对 ASP.Net 还是很陌生,所以如果有更好的方法来完成我想要完成的任务,或者如果您需要其他信息,请告诉我!
编辑
感谢大家的帮助!我现在可以让它工作了!我的大问题是查询字符串中日期周围的百分比符号。我删除了那些,并在我第一次从 URL 设置日期时更改了日期的数据类型(最初是字符串,但更改为日期时间。然后我从每个添加中删除了 .toString() 部分,因为它们不需要(它们被设置为字符串最初,除了日期,我不想将其转换为字符串。经过这些更改,它提供了所需的结果,并与查询字符串的其余部分一起使用。您的建议非常宝贵,我不能说非常感谢!
解决方法
在这段代码中,您有很大的误解,认为您将日期作为字符串操作
if (sSDate != "")
{
dsResults.SelectParameters.Add("startdate",sSDate.ToString());
ninthpart = " AND DateEntered > '%' + @startdate + '%'";
}
如果sDate
是以字符串格式从用户输入中检索到的,则需要对其进行转换。您可以使用 any 或 Convert.ToDateTime,DateTime.Parse,DateTime.TryParse
等。您需要将日期作为 DateTime
传递。在查询中,将日期视为参数化的 date
。不要将其转换为字符串。你的代码应该看起来像
if (DateTime.TryParse(sSDate,out DateTime myDate))
{
dsResults.SelectParameters.Add("@startdate",myDate); //<--
ninthpart = " AND DateEntered > @startdate"; //<--
}
现在这在所有杠杆上都很好。
,首先,几乎所有数据库系统使用的日期格式是内部日期格式。外部日期格式,以及计算机的区域设置当然会导致这种格式发生变化,或者通常您甚至不知道!
在sql server中,日期格式应该是ISO。即 YYYY-MM-DD。并且您没有用 % 包围日期。用单引号将日期括起来。
并且您不应该使用某些 DateVar.ToString。原因当然是在这种情况下吐出的日期将基于用户的日期设置 - 但您不希望那样。
所以,你的代码应该是这样的:
if (sSDate != ""){
dsResults.SelectParameters.Add("@startdate",DbType.Date,sSDate.ToString("YYYY-MM-dd"));
ninthpart = " AND DateEntered > @startdate ";
}
以上假设使用 SQL 服务器 - 但也适用于 MS-access。因此,您需要/想要/应该将日期格式强制为 sql server 等将接受的标准格式。 (您不想使用或让用户的系统默认设置转换为字符串 - 否则您很可能会得到一个翻转月份和日期的日期字符串。
例如:
MM/DD/YYYY
或
DD/MM/YYYY
因为我们有
05/10/2020
那是 5 月 10 日,还是 10 月 5 日?好吧,您得到的字符串将取决于用户的日期设置!!!
所以,这就是为什么您总是希望将日期输出字符串强制为已知和标准格式 - 而不是用户设置。只要那个变量是一个日期,或者声明为一个日期时间变量,那么上面应该没问题。
出现困难的地方取决于用户输入的文本框。您应该将其强制为日期控件 - 因此该控件的结果将是真正的日期数据类型。 因此,假设 Web 表单上的控件设置为 date,那么您会看到:
然后在代码中,将结果推入实际日期或日期时间变量。
dim dtMyDate as date
或
dim dtMyDAte as datetime
then - dtMyDate = MyDateTextBox.Text
then use above and the tostring as a formatted ISO sql server date string.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。