从同一线程多次调用sub

时间:2019-10-29 16:27:00

标签: sql vb.net datareader

我有一个单线程应用程序,该应用程序需要多次调用sub,每次都传递不同的参数。唯一的问题是该子程序打开一个数据读取器,并从数据库读取数据(使用传递的参数)。效果很好,但是读取操作需要几秒钟,因此第二次调用该子程序将引发错误“已经有与此连接关联的打开的数据读取器”。

在不重新设计整个应用程序的情况下,我需要在数据读取器上执行一些操作以允许多次读取同时发生吗?

谢谢。

例如:

For x as integer = 0 to 10
 dim id as integer = my_sub(x)
Next X

Private function my_sub(x)

  dim return_value as integer = 0

  my_reader = sqldatareader
  db.cmd.CommandText = "select id from database where id = " & x
  my_reader = db.cmd.ExecuteReader
  my_reader.Read()
  If my_reader.HasRows Then
     return_value = my_reader(0)
  End If
  my_reader.Close()

  Return return_value

End Sub

1 个答案:

答案 0 :(得分:2)

用户HardCodetheir comment中提供了很好的解释:

  

您的命令(可能是您的连接)的作用域不限于my_sub()。您应该在需要时实例化连接和命令对象,然后处置它们。您的实例已经实例化(并且连接已打开),并包装在变量db中。这就是导致问题的原因。

相应的代码将类似于

Private Function MySub(x As Integer) As Integer

    Dim returnValue As Integer = 0

    Using conn As New SqlConnection(yourConnectionString)
        Dim sql = "SELECT [id] FROM [database] WHERE [id] = @x"

        Using cmd As New SqlCommand(sql, conn)
            cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@x", .SqlDbType = SqlDbType.Int, .Value = x})

            conn.Open()
            Dim rdr = cmd.ExecuteReader()

            If rdr.HasRows Then
                rdr.Read()
                returnValue = rdr.GetInt32(0)
            End If

            rdr.Close()
            conn.Close()

        End Using
    End Using

    Return returnValue

End Function