【问题标题】:Compare date from database using parameters使用参数比较数据库中的日期
【发布时间】:2010-05-20 13:03:56
【问题描述】:
string queryString = "SELECT SUM(skupaj_kalorij)as Skupaj_Kalorij  "
                + "FROM (obroki_save LEFT JOIN users ON obroki_save.ID_uporabnika=users.ID)"
                + "WHERE (users.ID= " + a.ToString() + ") AND (obroki_save.datum= @datum)";

            using (OleDbCommand cmd = new OleDbCommand(queryString,database))                                    
                {
                    DateTime datum = DateTime.Today;
                    cmd.Parameters.AddWithValue("@datum", datum);
                }
            loadDataGrid2(queryString);

我现在尝试使用参数。但我真的不知道如何正确地做到这一点。我试过这样,但参数 datum 没有得到任何值(根据 c#)。

【问题讨论】:

  • 什么错误?还有你在哪里比较日期,我可以看到你创建日期但不使用它?
  • 错误可能是ToShortDateString以SQL无法识别的格式返回日期。 (通常最好使用参数在查询中传递参数。)但是如果没有说明实际发生了什么错误,很难判断错误的原因是这个还是完全不同的原因。
  • 整个where语句中查询命令中的数字语法错误(users.id=1 AND obroki_save.datum=20.5.2010)

标签: c# ms-access datetime parameters date-format


【解决方案1】:

请试试这个:

database = new OleDbConnection(connectionString);
                database.Open();
                date = DateTime.Now.ToShortDateString();
                string queryString = "SELECT SUM(skupaj_kalorij)as Skupaj_Kalorij  "
                    + "FROM (obroki_save LEFT JOIN users ON obroki_save.ID_uporabnika=users.ID)" 
                    + "WHERE users.ID= " + a.ToString()+" AND obroki_save.datum= '" +DateTime.Today.ToShortDateString() + "'";
                loadDataGrid2(queryString);

与Date一起使用时,一定要这样写

select * from table where date = '@date'

不喜欢

select * from table where date = @date

【讨论】:

  • 但是伙计。我现在没有得到任何结果......因为我在数据库中将数据类型从日期更改为文本。现在我将它改回日期/时间,我收到一个错误,即条件语句中的数据类型错误。
  • 使用 DateTime.Now.ToString();而不是 DateTime.Now.ToShortDateString();
  • 我更改了顶部的逗号(无论现在如何调用它们:D),所以我收到一条消息,指出 where 语句中某处的数字存在语法错误
【解决方案2】:

虽然发布错误通常很有用,但我会冒险猜测并说您的日期出现转换错误。

你真的应该看看参数化你的查询......

您应该阅读以下内容:http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/

如果您不介意阅读该内容,请尝试将您的 'a' 变量更改为 '1;放置表obroki; --'(但仅在您备份数据库之后)。

【讨论】:

  • 您是否尝试使用 # 分隔日期?
  • 顺便说一句,Jet/ACE 不易受到该特定 SQL 注入漏洞的攻击,因为它一次只执行一条 SQL 语句。
【解决方案3】:

也许您需要用您正在使用的数据库的 SQL 方言编写您的 SQL 字符串。在 Jet/ACE SQL(Access 使用的)中,日期值的分隔符是 #,所以你需要这个:

  obroki_save.datum= #" +DateTime.Today.ToShortDateString() + "#"

当然,有些数据接口库会为你翻译这些东西,所以这里可能不是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多