尝试返回多个查询时获取Open DataReader错误

时间:2014-04-16 05:53:41

标签: mysql vb.net datareader

我知道这里有很多关于我的错误的帖子,但我找不到直接帮助我的答案。

我创建了一个SQL类,因此我可以传递查询并接收数据,而不是每次调用单独的例程。我班的代码如下:

Imports MySql.Data.MySqlClient

Public Class SQLHandler

    Public Function ReturnData(ByVal strSql As String) As DataTable
        'method receives an sql query string and returns a dataTable
        Try
            Using ExQry As New MySqlCommand(strSql, MySQLConn)
                Using da As New MySqlDataAdapter(ExQry)
                    Dim tempDT As New DataTable

                    da.Fill(tempDT)
                    da.Dispose()
                    ExQry.Dispose()

                    Return tempDT
                End Using
            End Using

        Catch ex As Exception
            CreateLog("Module: ReturnData()" & vbNewLine & "Exception Error: " & ex.Message)
            MsgBox("Exception Error: " & ex.Message, MsgBoxStyle.Critical, "Module: ReturnData()")
            Return Nothing
        End Try
    End Function

    Public Function ReturnIntValue(ByVal strSql As String) As Integer
        'method receives an sql query string and returns a integer
        Try
            Using ExQry As New MySqlCommand(strSql, MySQLConn)
                Dim result As Integer = Convert.ToInt32(ExQry.ExecuteScalar())

                ExQry.Dispose()

                Return result
            End Using

        Catch ex As Exception
            CreateLog("Module: ReturnIntValue()" & vbNewLine & "Exception Error: " & ex.Message)
            MsgBox("Exception Error: " & ex.Message, MsgBoxStyle.Critical, "Module: ReturnIntValue()")
            Return Nothing
        End Try
    End Function
End Class

一个函数是返回一个数据表,第二个函数返回一个值。 我遇到的问题是我的代码会对这个类进行各种调用(一个接一个),有时会返回一个数据表,有时会返回一个值。但是,我发现如果我在另一个查询后直接请求查询,我收到一个关于已经有一个打开的datareader的错误。

我不知道如何阻止我的代码等到查询完成并关闭之后再运行另一个。

我一直在ReturnIntValue函数中得到错误,所以我假设它在返回数据表之前调用了这个例程。

任何帮助将不胜感激。显然我做错了什么。 感谢

2 个答案:

答案 0 :(得分:0)

尝试获取单个数据... 不使用Reader(基本上不使用Reader是安全的,因为当更多的计算机连接到它时它可能导致DB不稳定(避免DB.Close())

Dim SerialMac As New SqlConnection(CommandString)
Dim CMD As New SqlCommand
Dim sqlAdapter As SqlDataAdapter


  Public Function getDataInDB(ByVal sQuery As String) As String
    getDataInDB = Nothing
    Try
        CMD = New SqlCommand(sQuery, TestResult)
        Dim sqlAdapter As SqlDataAdapter
        Dim dataS As DataSet
        sqlAdapter = New SqlDataAdapter(CMD)
        dataS = New DataSet
        sqlAdapter.Fill(dataS, "getRecord")
        getDataInDB = dataS.Tables("getRecord").Rows(0).ItemArray(0).ToString()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Function

Plus在DataGridview上显示数据

Public Sub displayTestResults(ByRef mDataGridView As DataGridView, ByVal sQuery As String)
    Try
        connectToDB()
        CMD = New SqlCommand(sQuery, TestResult)
        Dim sqlAdapter As SqlDataAdapter
        Dim dataS As DataSet
        sqlAdapter = New SqlDataAdapter(CMD)
        dataS = New DataSet
        sqlAdapter.Fill(dataS, "Records")
        mDataGridView.DataSource = dataS.Tables("Records")
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

答案 1 :(得分:0)

在这里找到一篇很棒的文章[http://www.developerfusion.com/code/5445/sql-data-provider-vbnet-class/],其中提供了有关设置正确的SQL类以在整个应用程序中处理多个连接的详细信息。