asp.net – .Net ADO连接类

我创建了一个连接类,它应该将数据表/ datareaders等返回到我的网页.我担心使用这个类不会正确关闭连接.这是班级:

Imports Microsoft.VisualBasic

Namespace myConnection
  Public Class DB

      Public Shared Function GetConnStr()
                    Return "server=foobar"
      End Function


      Public Shared Function OpenConn()
                    Return New System.Data.SqlClient.SqlConnection( GetConnStr )
      End Function

      Public Shared Function OpenReader(SQL As String)

                    Dim conn 
                    conn = OpenConn
                    conn.Open

                    Return New System.Data.SqlClient.SqlCommand(SQL, conn).ExecuteReader(System.Data.CommandBehavior.CloseConnection)

      End Function

      Public Shared Function OpenTable(SQL As String)

                    Dim conn 
                    conn = OpenConn
                    conn.Open

                    Dim dr As System.Data.SqlClient.SqlDataReader = New System.Data.SqlClient.SqlCommand(SQL, conn).ExecuteReader(System.Data.CommandBehavior.CloseConnection)
                    Dim dt As System.Data.DataTable = New System.Data.DataTable()
          dt.Load(dr)

                    Return dt 

      End Function

      Public Shared Function ExecuteSQL(SQL As String)

                    Dim conn 
                    conn = OpenConn
                    conn.Open

                    Return New System.Data.SqlClient.SqlCommand(SQL, conn).ExecuteNonQuery()

      End Function


  End Class
End Namespace

以下是我使用它的方式:

rst = conn.OpenReader(SQL)
While rst.Read  
end while
rst.close

我担心一旦我投入生产,连接将无法正常关闭,我的网站将失败.我是.net的新手,这个班级背后的校长有什么不对吗?

最佳答案 你是对的:你的连接不会以这种方式关闭.更糟糕的是,通过只为您的sqlcommand接受字符串,您可以打开自己的sql注入安全漏洞.作为更好的模式的一个例子,我用来填充数据表的代码看起来更像这样:

Public Function GetDataTable(ByVal sql As String, ByVal AddParameters As Action(Of SqlParameterCollection)) As DataTable
    Dim result As New DataTable()
    Using cn As SqlConnection = OpenConn(), _
          cmd As New SqlCommand(sql, cn)

        AddParameters(cmd.Parameters)

        Using rdr As SqlDataReader = cmd.ExecuteReader
            result.Load(rdr)
        End Using
    End Using
    Return result
End Function

然后我会调用这样的代码:

Dim data As DataTable = GetDataTable("SELECT * FROM SomeTable WHERE ID= @ID", _ 
       Sub(p)
           p.Add("@ID", SqlDbType.Int).Value = 12345
       End Sub )

对于SqlDataReader,我在C#中有类似的代码,但是它需要使用迭代器块,并且该功能不适用于几周前用于Visual Studio 2010和Async CTP的服务包仅为just added to VB.Net.这里要带走的重要一点是我使用Using块正确封装了sql连接,代码鼓励正确使用查询参数.

点赞