VB.net语言编程,反复调用SQL语句编写的数据读取函数来读取数据库Access中的数据,出现崩溃的问题
各位大神!我用VB.net语言编程,用SQL语言的Select语句读取数据库Access中的数据,由于数据库中的数据非常多(有几百个),我就将读取数据的SQL代码集成为一...
各位大神!
我用VB.net语言编程,用SQL语言的Select语句读取数据库Access中的数据,由于数据库中的数据非常多(有几百个),我就将读取数据的SQL代码集成为一个函数,读取数据时反复调用该函数得到数据库中的数据。代码如下:
Private Function ReturnReadData(ByVal AimZiDuanName As String, ByVal TableName As String, ByVal TiaoJianZiDuanName As String, ByVal JiLuName As String) As String
Dim myConStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\Users\lafox\Desktop\外部参数.accdb;Persist Security Info=False"
Dim myCon As New OleDb.OleDbConnection(myConStr)
Dim mySelectQuery As String = "Select " & AimZiDuanName & " from " & TableName & " where " &
TiaoJianZiDuanName & "='" & JiLuName & "'"
Dim myCommand As New OleDb.OleDbCommand(mySelectQuery, myCon)
myCommand.Connection.Open()
Dim myReader As OleDb.OleDbDataReader = myCommand.ExecuteReader
While myReader.Read
If myReader.Item(0) Is System.DBNull.Value Then
Return ""
Else
Return myReader.Item(0)
End If
myReader.Close()
myCon.Close()
End While
End Function
现在在一个窗体的代码窗口中我写了几个过程(Sub),假设为SubA,SubB,SubC,SubD,SubE,每个过程“依次”调用上述函数(ReturnReadData)来数据读取。假设每个过程调用100次,上述五个过程则需要调用500次。
但问题是不管这五个过程谁先执行(假设先执行SubC,SubD,再执行SubA,SubB,SubE),总是只能调用有限次数的ReturnReadData函数(比如230次),函数调用到231次时就退出崩溃了。
我想是不是计算机的内存不够用还是什么原因?百思不得其解!请各位高手支支招,在下不胜感激! 展开
我用VB.net语言编程,用SQL语言的Select语句读取数据库Access中的数据,由于数据库中的数据非常多(有几百个),我就将读取数据的SQL代码集成为一个函数,读取数据时反复调用该函数得到数据库中的数据。代码如下:
Private Function ReturnReadData(ByVal AimZiDuanName As String, ByVal TableName As String, ByVal TiaoJianZiDuanName As String, ByVal JiLuName As String) As String
Dim myConStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\Users\lafox\Desktop\外部参数.accdb;Persist Security Info=False"
Dim myCon As New OleDb.OleDbConnection(myConStr)
Dim mySelectQuery As String = "Select " & AimZiDuanName & " from " & TableName & " where " &
TiaoJianZiDuanName & "='" & JiLuName & "'"
Dim myCommand As New OleDb.OleDbCommand(mySelectQuery, myCon)
myCommand.Connection.Open()
Dim myReader As OleDb.OleDbDataReader = myCommand.ExecuteReader
While myReader.Read
If myReader.Item(0) Is System.DBNull.Value Then
Return ""
Else
Return myReader.Item(0)
End If
myReader.Close()
myCon.Close()
End While
End Function
现在在一个窗体的代码窗口中我写了几个过程(Sub),假设为SubA,SubB,SubC,SubD,SubE,每个过程“依次”调用上述函数(ReturnReadData)来数据读取。假设每个过程调用100次,上述五个过程则需要调用500次。
但问题是不管这五个过程谁先执行(假设先执行SubC,SubD,再执行SubA,SubB,SubE),总是只能调用有限次数的ReturnReadData函数(比如230次),函数调用到231次时就退出崩溃了。
我想是不是计算机的内存不够用还是什么原因?百思不得其解!请各位高手支支招,在下不胜感激! 展开
2个回答
展开全部
下面这段代码中,myReader,myCon的关闭应在WHILE循环外。这还不是主要问题,如果你只读取首行首列不要用OleDbDataReader,直接用myCommand.ExecuteScalar就可以了,只要判断一下myCommand.ExecuteScalar返回是否为nothing就行。效率会高很多。
While myReader.Read
If myReader.Item(0) Is System.DBNull.Value Then
Return ""
Else
Return myReader.Item(0)
End If
myReader.Close()
myCon.Close()
End While
While myReader.Read
If myReader.Item(0) Is System.DBNull.Value Then
Return ""
Else
Return myReader.Item(0)
End If
myReader.Close()
myCon.Close()
End While
更多追问追答
追问
首先谢谢你的热心回答!我是从数据库的多个数据表中读取的数据,每次读的数据也不一定是首行,所以没用ExecuteScalar。
另外,myReader,myCon的关闭放在WHILE循环外,还是一样的问题。
是不是每执行完一次循环得释放一下内存啊?感觉好怪啊!
追答
在这个WHILE循环中只返回了第一行的第一列,没必要用循环呀
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你可以将new的对象尝试拿到外面作为全局变量来使用,不断的new对象会导致内存增加,一般在同时存在1000个对象的时候,系统就会崩溃了,如果你不想放到全局,就应该增加 对象 = nothing来彻底释放资源
追问
我觉得你的说法是正确的,今天加群咨询了下,将New的对象用Using就行了,比如Using myCon As New OleDb.OleDbConnection(myConStr),最后End Using就行啦,这样应该和你说的释放资源一个道理。谢谢你了!
追答
也谢谢你,共同学习~
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询