Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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 比较数据库中的两个日期时的数据类型不匹配条件_Vb.net - Fatal编程技术网

Vb.net 比较数据库中的两个日期时的数据类型不匹配条件

Vb.net 比较数据库中的两个日期时的数据类型不匹配条件,vb.net,Vb.net,在下面比较两个日期并获取数据。但是从表单中,我正确获取了两个日期,并且显示了一个错误数据类型不匹配。请帮助我如何解决此问题 Form.vb: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click provider = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source="

在下面比较两个日期并获取数据。但是从表单中,我正确获取了两个日期,并且显示了一个错误数据类型不匹配。请帮助我如何解决此问题

Form.vb:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        provider = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source="
        dataFile = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        connString = provider & dataFile
        myConnection.ConnectionString = connString
        myConnection.Open()
        Dim dt As New DataTable
        Dim ds As New DataSet
        ds.Tables.Add(dt)
        Dim da As New OleDbDataAdapter
        da = New OleDbDataAdapter("Select * from Add_Student Where Fee_Date between '" + DateTimePicker1.Value.ToString() + "' and '" + DateTimePicker2.Value.ToString() + "'", myConnection)
        da.Fill(dt)
        Add_StudentDataGridView.DataSource = dt.DefaultView
        myConnection.Close()
    End Sub

如果您使用的是Access,那么格式化日期文本的正确方法与在VB中的方法相同,即

da = New OleDbDataAdapter("Select * from Add_Student Where Fee_Date between #" + DateTimePicker1.Value.ToString("d/MM/yyyy h:mm:ss tt") + "# and #" + DateTimePicker2.Value.ToString("d/MM/yyyy h:mm:ss tt") + "#", myConnection)
如果只想比较日期,则应删除时间部分

在这样的表达式中使用
&
运算符是很难理解的。相反,您应该使用
String.Format

da = New OleDbDataAdapter(String.Format("Select * from Add_Student Where Fee_Date between #{0:d/MM/yyyy h:mm:ss tt}# and #{1:d/MM/yyyy h:mm:ss tt}#",
                                        DateTimePicker1.Value,
                                        DateTimePicker2.Value),
                          myConnection)
或者,在VB的最新版本中,字符串插值:

da = New OleDbDataAdapter($"Select * from Add_Student Where Fee_Date between #{DateTimePicker1.Value:d/MM/yyyy h:mm:ss tt}# and #{1:d/MM/yyyy h:mm:ss tt}#",
                          myConnection)
当然,最好的选择是不使用任何类型的字符串连接,而是使用参数:

da = New OleDbDataAdapter($"Select * from Add_Student Where Fee_Date between @StartDate and @EndDate",
                          myConnection)

With da.SelectCommand.Parameters
    .AddWithValue("@StartDate", DateTimePicker1.Value)
    .AddWithValue("@EndDate", DateTimePicker2.Value)
End With
有关使用ADO.NET参数的详细信息


注意:我认为Access支持“h:mm:ss tt”表示时间,但如果不支持,请尝试“HH:mm:ss”。

尝试将
DateTimePicker1.Value.ToString()更改为
DateTimePicker1.Value.ToString(“yyyy-mm-dd”)
,并对下一个进行相同的操作。它应该提供一种更为简单的格式。。可互换的。希望它能帮你一个小忙-在你整理好这个问题之后,确保你对查询进行了参数化-这是非常容易受到SQL注入攻击的。使用参数化查询(
“选择*从添加学生,费用日期介于?和之间?”
,其中有两个参数用于开始日期和结束日期)。一旦你学会了怎么做,您将受到SQL注入攻击的保护。仍然会收到相同的错误Mihai Ovidiu DrăGoijmcillhinney’答案似乎很可靠。比较两个日期时,很小的疑问是相同的,然后什么也不显示如果您的数据库列只包含日期而不包含时间,则您需要修剪筛选值的时间。如果使用前三个示例中的一个,只需省略格式字符串的时间部分。如果使用的是参数,请使用
DateTimePicker1.Value.Date
将参数值的时间归零。如果这还不能解决问题,那么您必须更具体地了解数据库包含的内容以及使用的确切代码和参数值。这可能是一个新问题。再次感谢,明白了