我使用3层架构在vb.net项目中工作
我有类BL包含函数名称:显示所有客户,这是代码:`
Public Function ShowCustomer() As Customer()
Dim sql As String
Dim emps(-1) As Customer
Dim e1 As Customer
sql = "select Customer_name from Customer"
Dim dr As SqlDataReader = OBJECT_M.Exe_SQL(sql)
While dr.Read
e1 = New Customer
e1.Customer_Name = dr(0)
ReDim Preserve emps(UBound(emps) + 1)
emps(UBound(emps)) = e1
End While
Return emps
End Function
现在在界面中我需要处理所有客户名称并在列表视图中写下名称
我的代码:
Dim obj As New BL
Dim obj2 As New Customer
Dim x As Integer = 1
While x <> obj.ShowCustomer.Length
lb.Items.Add(obj.ShowCustomer(x).Customer_Name.ToString())
End While
但我有关于此的错误消息:
其他信息:连接未关闭。连接的当前状态是打开的。
请有人能保存我的一天吗?
答案 0 :(得分:1)
对于SqlConnection,SqlCommand,SqlDataReader,DataTable,DataSet(以及任何其他一次性对象),请确保在完成后对象的Dispose()。
如果在这种情况下不调用Dispose()(或Close())连接将保持打开状态,您将获得内存并处理泄漏。
最简单的方法是使用Using
关键字(如果发生异常或其他短路事件,也会处置:
Using dr As SqlDataReader = OBJECT_M.Exe_SQL(sql)
While dr.Read
e1 = New Customer
e1.Customer_Name = dr(0)
ReDim Preserve emps(UBound(emps) + 1)
emps(UBound(emps)) = e1
End While
End Using
确保在上面OBJECT_M.Exe_SQL中详述的对象中执行相同操作,一旦在oject上调用了Dispose()/ Close(),就无法再次使用该对象的实例必须创建一个新实例。
有关更多示例,请参阅文档:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.110).aspx
虽然使用数组没有任何问题,但您可能会发现使用List(T)很容易,以后可以转换为使用ToArray()。