vb.net 3层架构错误消息打开连接

时间:2017-02-06 17:13:44

标签: sql vb.net

我使用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

但我有关于此的错误消息:

  

其他信息:连接未关闭。连接的当前状态是打开的。

请有人能保存我的一天吗?

1 个答案:

答案 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()。