首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用日期值构建SelectCommand

使用日期值构建SelectCommand
EN

Stack Overflow用户
提问于 2020-12-28 20:59:28
回答 2查看 164关注 0票数 1

我正在ASP.NET/ C# WebForms中构建一个查询。查询依赖于一系列if语句,如下所示:

代码语言:javascript
复制
//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 = "";
}

最后,我将它们全部添加到用于构建查询的字符串中,如下所示:

代码语言:javascript
复制
entirecommand = firstpart + secondpart + thirdpart + fourthpart + fifthpart + sixthpart + seventhpart + eighthpart + ninthpart + " ORDER BY [StudentID]";

最后,我决定

dsResults.SelectCommand = entirecommand;

执行查询,并将结果数据库到网格视图,如下所示:

代码语言:javascript
复制
if (!Page.IsPostBack){
    //bind the gridview data
    gvResults.DataSource = dsResults;
    gvResults.DataBind();
}

在我尝试将日期添加到查询之前,一切都运行得很完美。

代码语言:javascript
复制
if  (sSDate != ""){
    dsResults.SelectParameters.Add("startdate", sSDate.ToString());
    ninthpart = " AND DateEntered > '%' + @startdate + '%'";
}

当我尝试这样做时,当转换日期和/或字符字符串的时间时,我会得到错误‘转换失败。’在线路上:

代码语言:javascript
复制
gvResults.DataBind();

我把日期写成了第九部分,所以直到最后才加进去。正如我说过的,没有在字符串中添加第九部分,一切都按预期工作。

为了记录在案,我的日期在URL:中是这样的格式。只寻找比那个日期更大的日期,根本不关心时间。

我真的不知道该把这个放在哪里,所以如果有人有什么建议,请告诉我。我对ASP.Net还很陌生,所以如果有更好的方法来完成我想要完成的任务,或者如果你需要更多的信息,请告诉我!

编辑

谢谢大家的帮助!我现在就能让它起作用了!我最大的问题是查询字符串中日期周围的百分比符号。我删除了这些内容,并在第一次从URL中设置日期时更改了它的数据类型(最初是字符串,但后来更改为datetime )。然后,我从每个添加中删除了.toString()部分,因为它们是不必要的(它们最初被设置为string,除了日期之外,我不想将日期转换为string)。在这些更改之后,它提供了所需的结果,并与查询字符串的其余部分一起工作。你的建议是无价的,我不能说足够的感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-28 22:04:59

在这段代码中,您有一个很大的误解,认为您将日期操作为字符串。

代码语言:javascript
复制
if  (sSDate != "")
{
    dsResults.SelectParameters.Add("startdate", sSDate.ToString());
    ninthpart = " AND DateEntered > '%' + @startdate + '%'";
}

如果从用户输入中以字符串格式检索sDate,则需要对其进行转换。YOu可以使用任何或Convert.ToDateTime, DateTime.Parse, DateTime.TryParse等,您需要将日期作为DateTime传递。在查询中,将日期视为参数化date。不要把它转换成字符串。您的代码应该看起来像

代码语言:javascript
复制
if  (DateTime.TryParse(sSDate, out DateTime myDate))
{
    
    dsResults.SelectParameters.Add("@startdate", myDate);  //<--
    ninthpart = " AND DateEntered > @startdate"; //<--
}

这在所有的杠杆上都很好。

票数 3
EN

Stack Overflow用户

发布于 2020-12-28 21:59:45

首先,几乎所有数据库系统使用的日期格式都是内部日期格式。当然,外部日期格式和计算机的区域设置会导致此格式发生更改,或者甚至不为您所知!

在sql server中,日期格式应该是ISO。那是DD。而且您不会用%包围日期。你用单引号环绕日期。

您不应该使用某些DateVar.ToString。当然,原因是在这种情况下,所吐出的日期将基于用户日期设置--但您不希望这样做。

所以,您的代码应该如下所示:

代码语言:javascript
复制
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窗体上的控件设置为日期,那么您将看到以下内容:

然后在代码中,将结果推入实际日期,或日期时间变量。

代码语言:javascript
复制
dim dtMyDate as date

代码语言:javascript
复制
dim dtMyDAte as datetime

then - dtMyDate = MyDateTextBox.Text

then use above and the tostring as a formatted ISO sql server date string.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65484023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档