如何在不消耗太多内存的情况下创建函数“ExecuteSql”

时间:2011-10-24 19:28:42

标签: .net vb.net

我写了一个.NET函数:

Public Function ExecuteSql(strSql As String, connectionString As String) As SqlDataReader

    Dim conn As New SqlConnection(connectionString)
    Dim cmd As New SqlCommand(strSql, conn)
    Dim dr As SqlDataReader

    Try
        conn.Open()
        dr = cmd.ExecuteReader()

    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString)

    End Try

    Return dr

End Function

如您所见,此函数返回一个datareader,因此我可以随意操作数据。 问题是:连接保持打开状态。

如何解决这个问题?是否有命令'关闭全局连接'? 感谢

2 个答案:

答案 0 :(得分:3)

你必须致电

dr.close()

使用完数据阅读器后。或者,您可以创建DataAdapter,然后使用Fill填充DataTable。使用数据表时,只要调用fill,就可以立即关闭连接,而不必等到“ExecuteSQL”功能另一端的代码完成,就像使用DataReader一样。

答案 1 :(得分:1)

我建议您不要返回DataReader,除非您在代码中的一个非常孤立的位置使用它 - @Kibbee正确回答说明您需要在完成后明确关闭阅读器,并且如果您暴露在整个应用中,这种方法会增加您可能忘记关闭连接的风险。

DataReader是一个单向的,仅限一次的集合。在我看来,它真的是为填写下拉列表等任务而设计的。根据您需要的数据,还有很多其他方法。

如果您需要允许用户在将更改保存回数据库之前修改数据,那么DataSet / DataTable可能是更好的解决方案,它不会保持打开连接,并且它允许您向前/向后迭代在数据中搜索。

另一种常见模式是创建“业务实体”或“数据传输对象”,它们与数据库断开连接,并明确用于保存数据以进行绑定和操作。这些可以生成或编写为具有与底层数据库数据类似的结构当需要保存更改时,您将调用ADO.Net或其他一些数据库技术来保留更改。您可以了解有关业务实体和数据传输对象的大量信息,但这些方法解决的问题之一是帮助将数据访问代码和连接与应用程序的其他层分离。