在数据库中获取日期时出错(介于| VB.NET | OLE子句之间)
不久前,我使用了一个代码从数据库中获取两个日期之间的日期(日期为dd/mm/yy的列),我认为它第一次运行得很好,代码是:在数据库中获取日期时出错(介于| VB.NET | OLE子句之间),vb.net,ms-access,oledb,ms-access-2007,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()
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子句获得它们之间的所有日期
但是现在,这段代码获取了一些数据,而忽略了其他数据,我的意思是有些日期介于两个日期之间,但代码从未获取,为什么会发生这种情况?如果查看生成的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 '
如果查看生成的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 '
您不能将Sqlstr更改为
SQLstr = " Select * from tb where lastvstart <= '" & b.ToString("dd MMM yyyy") & "'";
SQLstr=“Select*from tb,其中lastvstart您不能将SQLstr更改为
SQLstr = " Select * from tb where lastvstart <= '" & b.ToString("dd MMM yyyy") & "'";
SQLstr=“Select*from tb where lastvstart当我使用此代码时,编译器突出显示以下代码:DataAdapter1.Fill(DataSet1,“tb”),并告诉我数据类型不同?问题是什么?您使用的是哪个数据库?检查编辑后的答案,MS ACCESS日期的工作方式与Sql Server日期略有不同。我使用了参数,它解决了问题。谢谢您。当我使用此代码时,编译器突出显示以下代码:DataAdapter1.Fill(DataSet1,“Tb”),并告诉我数据类型不同?问题是什么?您使用的是哪一个数据库?检查编辑后的答案,MS ACCESS日期的工作方式与Sql Server日期略有不同我使用了参数,它解决了问题谢谢你a如何使用参数化查询,我是这方面的新手:PI查找和“添加”参数,但从未找到更新?参数化查询可能是一个巨大的痛苦。我已经使用VBA代码中连接的查询15年了,它们工作得很好。@Tony Toews:确保输入是干净的,或者在有人使用安全漏洞后进行清理也可能是一团混乱。我如何使用参数化查询,我是这方面的新手:PI查找和“添加”参数,但从未找到更新?参数化查询可能是一个巨大的痛苦。我已经使用VBA代码中连接的查询15年了,它们工作得很好。@Tony Toews:确保输入是干净的,或者在有人使用安全漏洞后进行清理也可能是一个巨大的混乱。@Tony Toews我相信ms-access-2007是一个重要的标签,其他人似乎也是如此,因为它被广泛使用。当然,问题根本不是访问,因为只有Jet/ACE在使用。但是下面评论中的原始问题表明他使用的是A2007,因此我认为2007标签是合适的,如果标签应该存在的话(而且我不认为一开始就应该存在特定版本的标签)。@David W.Fenton:“当然,问题根本不是访问,因为只有Jet/ACE在使用。”--当然是:访问数据库引擎。如果你列举“ACE”,可能会有所帮助——“A”现在代表什么?包括微软在内的全世界都将该引擎称为“Access”。为什么Stackoverflow会有所不同?@Tony Toews我认为ms-access-2007和其他人一样是一个重要的标签,因为它被广泛使用。当然,问题根本不是访问,因为只有Jet/ACE在使用。但是下面评论中的原始问题表明他使用的是A2007,因此我认为2007标签是合适的,如果标签应该存在的话(而且我不认为一开始就应该存在特定版本的标签)。@David W.Fenton:“当然,问题根本不是访问,因为只有Jet/ACE在使用。”--当然是:访问数据库引擎。如果你列举“ACE”,可能会有所帮助——“A”现在代表什么?包括微软在内的全世界都将该引擎称为“Access”。为什么Stackoverflow会有所不同?