我正在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;
执行查询,并将结果数据库到网格视图,如下所示:
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:中是这样的格式。只寻找比那个日期更大的日期,根本不关心时间。
我真的不知道该把这个放在哪里,所以如果有人有什么建议,请告诉我。我对ASP.Net还很陌生,所以如果有更好的方法来完成我想要完成的任务,或者如果你需要更多的信息,请告诉我!
编辑
谢谢大家的帮助!我现在就能让它起作用了!我最大的问题是查询字符串中日期周围的百分比符号。我删除了这些内容,并在第一次从URL中设置日期时更改了它的数据类型(最初是字符串,但后来更改为datetime )。然后,我从每个添加中删除了.toString()部分,因为它们是不必要的(它们最初被设置为string,除了日期之外,我不想将日期转换为string)。在这些更改之后,它提供了所需的结果,并与查询字符串的其余部分一起工作。你的建议是无价的,我不能说足够的感谢!
发布于 2020-12-28 22:04:59
在这段代码中,您有一个很大的误解,认为您将日期操作为字符串。
if (sSDate != "")
{
dsResults.SelectParameters.Add("startdate", sSDate.ToString());
ninthpart = " AND DateEntered > '%' + @startdate + '%'";
}如果从用户输入中以字符串格式检索sDate,则需要对其进行转换。YOu可以使用任何或Convert.ToDateTime, DateTime.Parse, DateTime.TryParse等,您需要将日期作为DateTime传递。在查询中,将日期视为参数化date。不要把它转换成字符串。您的代码应该看起来像
if (DateTime.TryParse(sSDate, out DateTime myDate))
{
dsResults.SelectParameters.Add("@startdate", myDate); //<--
ninthpart = " AND DateEntered > @startdate"; //<--
}这在所有的杠杆上都很好。
发布于 2020-12-28 21:59:45
首先,几乎所有数据库系统使用的日期格式都是内部日期格式。当然,外部日期格式和计算机的区域设置会导致此格式发生更改,或者甚至不为您所知!
在sql server中,日期格式应该是ISO。那是DD。而且您不会用%包围日期。你用单引号环绕日期。
您不应该使用某些DateVar.ToString。当然,原因是在这种情况下,所吐出的日期将基于用户日期设置--但您不希望这样做。
所以,您的代码应该如下所示:
if (sSDate != ""){
dsResults.SelectParameters.Add("@startdate", DbType.Date, sSDate.ToString("YYYY-MM-dd"));
ninthpart = " AND DateEntered > @startdate ";
}上述假设假设是SQL server,但也适用于。因此,您需要/希望/应该将日期格式强制为sql server等将接受的标准格式。(您不想使用或让用户的系统默认设置转换为string,否则您很可能会使用一个日期字符串来翻转月份和日期。
例:
毫米/年/年
或
日/月/年
因为我们有
2020年10月5日
是五月十日,还是十月五日?那么,您得到的字符串将取决于用户的日期设置!
因此,这就是为什么您总是希望将日期输出字符串强制为已知的标准格式,而不是用户设置。只要该变量是日期,或者声明为日期时间变量,那么上面就应该可以了。
困难可能发生的地方将取决于用户输入文本框。您应该将其强制到日期控件中,因此该控件的结果将是一个真正的日期数据类型。因此,假设web窗体上的控件设置为日期,那么您将看到以下内容:

然后在代码中,将结果推入实际日期,或日期时间变量。
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.https://stackoverflow.com/questions/65484023
复制相似问题