在数据库中获取日期时出错(BETWEEN 子句| VB.NET|OLE)
Posted
技术标签:
【中文标题】在数据库中获取日期时出错(BETWEEN 子句| VB.NET|OLE)【英文标题】:Error in getting Dates in database (BETWEEN Clause| VB.NET|OLE) 【发布时间】:2009-12-07 06:47:02 【问题描述】:不久之前,我使用代码从数据库中获取两个日期之间的日期(日期为 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 子句获取它们之间的所有日期
但是现在,这段代码获取了一些数据并超过了其他的,我的意思是一些日期在两个日期之间,但代码永远不会得到它,为什么会发生这种情况?
【问题讨论】:
@Tony Toews 我相信 ms-access-2007 和其他标签一样重要,因为它被广泛使用。 当然,问题根本与 Access 无关,因为只有 Jet/ACE 正在使用中。但是下面cmets中的原始问题表明他使用的是A2007,所以我认为2007标签是合适的,如果该标签应该存在的话(而且我不相信版本特定的标签应该首先存在)。 @David W. Fenton:“当然,问题根本与 Access 无关,因为只有 Jet/ACE 在使用”——当然是:Access 数据库引擎。如果您列举“ACE”可能会有所帮助——“A”现在代表什么?包括微软在内的全世界都将引擎称为“Access”。为什么 *** 应该有所不同? 【参考方案1】:如果您查看生成的 SQL 字符串,它是否包含您期望的日期?我假设数据库要求它遵循特定的格式(dd/MM/yyyy
或MM/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 '
【讨论】:
如何使用参数化查询,我是大一新生:P 我找到并“添加”参数但从未找到更新? 参数化查询可能是一个巨大的痛苦。大约 15 年来,我一直在使用 VBA 代码中连接的查询,它们工作得很好。 @Tony Toews:让真正确保输入是干净的,或者在有人使用安全漏洞之后进行清理也可能是一团糟。【参考方案2】:能不能不把Sqlstr改成
SQLstr = " Select * from tb where lastvstart <= '" & b.ToString("dd MMM yyyy") & "'";
编辑,根据数据库更改
使用这个字符串并检查它是否有效
SQLstr = " Select * from tb where lastvstart <= #" & b.ToString("dd MMM yyyy") & "#";
【讨论】:
当我使用这段代码时,编译器会高亮显示以下代码:DataAdapter1.Fill(DataSet1, "Tb") 并告诉我数据类型不一样?有什么问题? 您使用的是哪个数据库? 检查编辑的答案,MS ACCESS 日期与 Sql Server 日期略有不同 我使用了参数,它解决了问题,谢谢你。以上是关于在数据库中获取日期时出错(BETWEEN 子句| VB.NET|OLE)的主要内容,如果未能解决你的问题,请参考以下文章