填充DataSet时无效操作异常

时间:2016-10-24 08:04:31

标签: sql database vb.net

这是一个数据库驱动的货币转换器,程序必须从数据库中获取汇率并显示它们。

这是我迄今为止所做的。

Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged

    Dim da As OleDb.OleDbDataAdapter
    Dim ds As New DataSet
    Dim sql As String

    sql = "SELECT TOP 1 USD,EUR,GBP FROM dbexchangeRates WHERE Date='" & DateTimePicker1.Text.ToString & "'"
    da = New OleDb.OleDbDataAdapter(sql, cnnOLEDB)
    da.Fill(ds, "rates")

    If ds.Tables("rates").Rows.Count > 0 Then

        txtUSD.Text = ds.Tables("rates").Rows(0).Item(0).ToString
        txtGBP.Text = ds.Tables("rates").Rows(0).Item(1).ToString
        txtEUR.Text = ds.Tables("rates").Rows(0).Item(2).ToString

    End If


End Sub

End Class

我在

上收到了无效的操作异常
 a.Fill(ds, "rates") '

我做错了什么?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

试试这个:

Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged

    Dim ds As New DataSet

    Dim sql As String = "SELECT TOP 1 USD,EUR,GBP FROM dbexchangeRates WHERE Date= ?"

    Using connection As New OleDb.OleDbConnection(strConnectionString),
          command As New OleDb.OleDbCommand(sql, connection),
          adapter As New OleDb.OleDbDataAdapter(command)

        connection.Open()

        adapter.SelectCommand.Parameters.Add("@dt", OleDb.OleDbType.Date).Value = DateTimePicker1.Value
        adapter.Fill(ds, "rates")

        connection.Close()

    End Using

    If ds.Tables("rates").Rows.Count > 0 Then

        txtUSD.Text = ds.Tables("rates").Rows(0).Item(0).ToString
        txtGBP.Text = ds.Tables("rates").Rows(0).Item(1).ToString
        txtEUR.Text = ds.Tables("rates").Rows(0).Item(2).ToString

    End If

End Sub

我还没有检查过,但我想知道在DateTimePicker1.ValueChanged初始化cnnOLEDB之前是否正在调用方法MyBase.Load。这样,连接,命令和适配器都会同时初始化。通过实施Using,他们也将被处置。

您可能还想进行一些数据验证,以确保在使用查询调用数据库之前设置了有效日期,否则可能会发生其他异常。