【问题标题】:The selection sql statement is not responding to date value选择 sql 语句没有响应日期值
【发布时间】:2017-05-07 11:20:45
【问题描述】:

我正在尝试从日期与会话中的日期相同的数据库中选择项目。它说位置[0][2] 没有行,但实际上那里有一行。这是我的代码:

DateTime b = Convert.ToDateTime(Session["Dat"]);
int D = b.Day;
int M = b.Month;
int Y = b.Year;
string dat = M + "/" + D + "/" + Y ;

DataTable m;
m = DAL.SelectFromTable(
   "SELECT * FROM [ToDoList] where [UserID]='" + k + "' and  [D]="+ dat);
if (m.Rows.Count > 0)
{
    Response.Write("</br></br></br><center>" + m.Rows[0][2].ToString() + "</center>");
}

【问题讨论】:

  • 您实际使用的是哪个数据库?
  • 在 SQL 字符串中,您是否需要像为 UserId 一样在日期周围添加单引号?
  • 我正在使用访问权限

标签: c# sql ms-access


【解决方案1】:

访问要求日期用# 括起来。

假设 DAL 不是您编写的,并且您实际上没有正确安全地查询数据库的选项,您必须执行以下操作:

...and [D] = #" + dat + "#"

但是,@thisextendsthat 有一个好处,那就是这可能不会返回任何结果,因为您必须将日期的时间部分与数据库中的数据完全相同,并且您只使用月、日和年来构建日期。

您还可以通过选择一个范围来绕过时间部分:

... and [D] BETWEEN #" + dat + "# AND #" + // one day greater than your date at midnight + "#"

但如果你这样做了,你必须小心不要创建一个不可能的日期,例如 5 月 32 日。

请务必感谢您的老师继续培训学生进行不安全编码,将 SQL 注入漏洞保留在 OWASP top 10 的顶部,就在它所属的位置。

【讨论】:

  • 阿门! :)
【解决方案2】:

没有理由重新发明轮子,只需使用方法ToString

DateTime b = Convert.ToDateTime(Session["Dat"]);
DataTable m;
m = DAL.SelectFromTable("select * from [ToDoList] where [UserID] = '" + k + "' and [D] = #" + dat.ToString("yyyy'/'MM'/'dd") + "#");

【讨论】:

    【解决方案3】:

    正如 Crowcoder 所说,您使用的是哪个数据库?这将有助于确定您应该如何将日期发送到您的查询中。

    如果基础字段是 datetime,那么您可能需要显式地从值中修剪时间部分,以便与日期进行比较。在 Sql 服务器中:

    ...where CAST([D] as DATE) = [The date passed in from from C#]
    

    否则,您可能会在某个任意时间将今天与今天午夜进行比较,这不会给您想要的结果。

    另外,请考虑参数化您的 Sql 查询 - 像这样构建字符串文字是不好的做法,并且会使您的应用容易受到 Sql 注入攻击。

    【讨论】:

    • 我实际上在读高中,我完全按照老师告诉我的去做
    • 但我不明白该怎么办?
    • 查看数据库的[ToDoList]表,找到[D]列——是DATE字段还是DATETIME字段?
    • 它是一个日期时间字段
    • 与此同时,OP 指出这是 MS Access(并且标签已更新)。 MS Access 无法识别CAST 语句。
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多