2010-03-31 34 views
0

之间的搜索数据我有一个查询如何指定日期

OleDbCommand com = _ 
    new OleDbCommand("select * from techs where actd0v between '" + _ 
        TextBox1.Text + "' and '" + TextBox2.Text + "'" , con); 

,其中文本框1和2中,我想,以检索与这些日期某个日期指定的日期。但是当我试图找到给定日期之间的数据时,它给了我一些不包含在它们之间的日期。是否有任何我需要指定的模式来获取指定日期之间发生的所有日期。

我为我的项目使用ms访问数据库。

回答

0

我猜测文本框中的文本没有以OleDB日期的公认格式。尝试使用格式“yyyy-MM-dd”。例如:2010-03-31。你可以在调试模式下运行应用程序并发布完整查询吗?

+0

在文本框中的日期是以格式“mm-dd-yyyy”.im指定的.im也在这里混淆,因为当我指定从任何月份的10日到同月30日的日期时,它会给我所有日期但是当我选择第一到第三十一,然后它会产生一些错误。当我分析是它需要1作为第十,所以它给了我从第10到第31的所有日期,当我给第一到第31时。同样,当我给第二到第31 。它给了我从20日到31日的日期。无法理解这一点。 – Mishigen 2010-03-31 21:10:24

+0

同样,这是由于您的日期格式。试试yyyy-MM-dd。如果你想使用MM-dd-yyyy,你需要在一天中写入“01”而不是“1”。这听起来像是期待两位数的日子,这就是为什么“1”被视为“10”。 – ChessWhiz 2010-03-31 21:24:31

1

查询的格式看起来正确。但是:

当心SQL注入!你需要确保未来的输入确实日期和不喜欢的事:

你可以做
'; drop table users; -- 

的一件事是:

DateTime.Parse(TextBox1.Text) 

和使用的。要*方法之一是访问将找到一个合适的格式。或者创建DateTime对象通常起作用的ODBC规范格式:

ODBC规范:YYYY-MM-DD HH:MM:SS.SSS

这里是一个不错的overview of Sql Injection你应该看看。它不是特定于Access的,但它很好地传达了这个概念。

+1

虽然引用的URL是一个关于SQL注入技术的良好讨论,但由于Jet/ACE不能执行多个语句,所以它的一大堆完全不适用于Access/Jet/ACE。所以,任何依赖附加第二个SQL DDL命令的注入都会失败。只有攻击者修改WHERE子句才能返回比预期更多的记录,并且“发现”漏洞(即故意发布错误的语句以查明数据库及其模式的特征),Jet/ACE才容易受到攻击。 – 2010-04-21 20:29:42

0

SQL注入警告抛开一边......我假设你相信你的用户。

认沽数字符号(#)的日期

OleDbCommand com = _ 
    new OleDbCommand("select * from techs where actd0v between #" + _ 
        TextBox1.Text + "# and #" + TextBox2.Text + "#" , con); 

MS接入的两边应该弄明白。

可能是“之间”是在日期的字符串表示形式上完成的,而不是日期类型;这将解释出界的结果。