从同一线程多次调用sub

问题描述 投票:0回答:1

我有一个单线程应用程序,该应用程序需要多次调用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
sql vb.net datareader
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.