【发布时间】:2019-10-29 16:27:00
【问题描述】:
我有一个单线程应用程序,它需要多次调用 sub 并每次传递不同的参数。唯一的问题是子打开一个数据读取器并从数据库中读取数据(使用传递的参数)。这工作正常,但读取操作需要几秒钟,所以对 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
【问题讨论】:
-
如果没有看到代码,您的问题可能会作为Exception: There is already an open DataReader associated with this Connection which must be closed first 的副本而被关闭。
-
我添加了一些代码。
-
需要注意的是这段代码有一个巨大的安全漏洞并且对SQL注入开放
-
Andrew Morton 的链接可以解决您的问题。您的命令,可能还有您的连接,不限于
my_sub()。您应该在需要时实例化您的连接和命令对象,然后处理它们。您的已经实例化(并且连接打开),包装在变量db中。这就是导致问题的原因。
标签: sql vb.net datareader