我创建了一个连接类,它应该将数据表/ 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连接,代码鼓励正确使用查询参数.