在数据库中获取日期时出错(BETWEEN子句| VB.NET | OLE)

时间:2009-12-07 06:47:02

标签: vb.net ms-access oledb ms-access-2007

在一段时间之前,我使用代码来获取数据库中两个日期之间的日期(日期为dd / mm / yy的列),我认为它第一次运行良好,代码是:

      Dim b As New Date
            Dim a As Integer
            a = Val(tx2.Text)
            b = System.DateTime.Today
            b = b.AddDays(-a)

             MsgBox(b)
 Conn.Open()
  SQLstr = " Select * from tb where lastvstart BETWEEN #01/01/1800# AND #" & b & "#"
 Dim DataAdapter1 As New OleDbDataAdapter(SQLstr, Conn)
   DataSet1.Clear()

        DataAdapter1.Fill(DataSet1, "Tb")
        Conn.Close()

如您所见,代码允许用户插入一个数字并将其减去今天的日期,然后计算我想要的日期,之后我使用BETWEEN子句来获取它们之间的所有日期

但是现在,这段代码获取了一些数据并超越了其他数据,我的意思是某些日期介于两个日期之间,但代码永远不会得到它,为什么会这样?

2 个答案:

答案 0 :(得分:2)

如果查看生成的SQL字符串,它是否包含您期望的日期?我假设数据库要求它遵循特定格式(给定查询中的硬编码日期,dd/MM/yyyyMM/dd/yyyy。当创建日期的字符串版本并将其插入到SQL查询中时,您的日期和月份是否可以切换位置?

作为旁注,我强烈建议不要像这样连接SQL查询。如果可能,请使用参数化查询。这可能还会删除一些类型转换问题。

<强>更新
以下是通过OLE DB对Access数据库使用参数化查询的示例:

Using connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\path\file.mdb""")
    Using cmd As New OleDbCommand("select * from tb where lastvstart BETWEEN ? AND ?", connection)

        Dim param As OleDbParameter

        ' add first date '
        param = New OleDbParameter()
        param.DbType = DbType.Date
        param.Value = New DateTime(1800, 1, 1)
        cmd.Parameters.Add(param)

        'add second date '
        param = New OleDbParameter()
        param.DbType = DbType.Date
        param.Value = DateTime.Today.AddDays(-a)
        cmd.Parameters.Add(param)
        cmd.Parameters.Add(New OleDbParameter())

        connection.Open()
        Using adapter As New OleDbDataAdapter(cmd)
            Using ds As New DataSet()
                adapter.Fill(ds)
                Console.WriteLine(ds.Tables(0).Rows.Count)
            End Using ' DataSet ' 
        End Using ' OleDbDataAdapter '
    End Using ' OleDbCommand '
End Using ' OleDbConnection ' 

答案 1 :(得分:1)

你能不能将Sqlstr改为

SQLstr = " Select * from tb where lastvstart <= '" & b.ToString("dd MMM yyyy") & "'";

编辑,根据数据库进行更改

使用此字符串并检查其是否有效

SQLstr = " Select * from tb where lastvstart <= #" & b.ToString("dd MMM yyyy") & "#";