Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数据库中获取日期时出错(介于| VB.NET | OLE子句之间)_Vb.net_Ms Access_Oledb_Ms Access 2007 - Fatal编程技术网

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

在数据库中获取日期时出错(介于| 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()

不久前,我使用了一个代码从数据库中获取两个日期之间的日期(日期为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子句获得它们之间的所有日期


但是现在,这段代码获取了一些数据,而忽略了其他数据,我的意思是有些日期介于两个日期之间,但代码从未获取,为什么会发生这种情况?

如果查看生成的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会有所不同?