2016-04-03 171 views
1

我试图将数据从数据库中提取到网格中。条件是SELECT * FROM entries WHERE edate='" & Me.dtpDate.Value.Date & "'"但是,我收到条件表达式enter image description here中的错误消息数据类型不匹配。请参阅下面的代码。此外,我附上了错误消息的屏幕截图。标准表达式(vb.net,access)中的数据类型不匹配

Private Sub dtpDate_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles dtpDate.Leave 
    'GetDayBookOpeningBalance() 
    If Me.lblHeading1.Text <> "Daybook entry" Then 
     Using MyConnection As OleDb.OleDbConnection = FrmCommonCodes.GetConnection(), 
      MyAdapter As New OleDb.OleDbDataAdapter("SELECT * FROM entries WHERE edate='" & Me.dtpDate.Value.Date & "'", MyConnection) 
      'Format(Me.dtpDate.Value.Date, "dd/MM/yyyy")) 
      If MyConnection.State = ConnectionState.Closed Then MyConnection.Open() 
      Using MyDataSet As New DataSet 
       MyAdapter.Fill(MyDataSet, "entries") 
       Me.grdDayBook.DataSource = MyDataSet.Tables("entries") 
       Dim DataSetRowCount As Integer = MyDataSet.Tables("entries").Rows.Count 
       If DataSetRowCount > 0 Then 
        SetGridProperty() 
       Else 
        ShowBlankGrid() 
        FrmCommonCodes.MessageDataNotFound() 
       End If 
      End Using 
     End Using 
    Else 
     ShowBlankGrid() 
    End If 
End Sub 
+1

这正是不使用参数化查询会发生的情况。表格中edate列的数据类型是什么?如果它不是一个字符串,为什么你传递一个字符串作为值? – Steve

+0

其日期字段 –

+1

当您在SQL中将日期放在周围时,它会变成文本。使用SQL参数来保存实际的数据类型。如果你只是抛弃它们,也不需要创建DataAdapter和DataSet。 – Plutonix

回答

3

这正是不使用参数化查询会发生的情况。
我敢打赌,您的专栏edate是日期/时间类型的列,但您将Me.dtpDate.Value.Date连接到您的sql string命令的其余部分。
这会强制从DateTime到String的自动转换,但转换不像数据库希望看到的那样。

如果您使用参数,则不存在转换,数据库引擎完全理解您传递的内容。

Dim sqlText = "SELECT * FROM entries WHERE [email protected]" 
MyAdapter As New OleDb.OleDbDataAdapter(sqlText, MyConnection) 
MyAdapter.SelectCommand.Parameters.Add("@dt", OleDbType.Date).Value = Me.dtpDate.Value.Date 
.... 
+1

你需要一个宏 – Plutonix

+0

Steve,Plutonix现在正在工作..我在未来也寻求你的帮助......非常感谢你......(Y) –

相关问题