我有一个单线程应用程序,该应用程序需要多次调用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
答案 0 :(得分:2)
用户HardCode在their 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