我创建了一个连接类,它应该将数据表/ 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的新手,这个班级背后的校长有什么不对吗?
答案 0 :(得分:2)
你是对的:你的连接不会以这种方式关闭。更糟糕的是,通过只为您的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 )
我在C#中有类似的代码用于SqlDataReader,但是它需要使用迭代器块,并且该功能不可用于VB 只有just added to VB.Net带有visual studio 2010的服务包和Async CTP在几周前发布。这里要带走的重要一点是我使用Using块正确封装了sql连接,代码鼓励正确使用查询参数。
答案 1 :(得分:0)
不幸的是,我同意其他一条评论。你为什么要编写自己的连接类?
使用ADO.NET EF或LINQ To SQL来管理上下文中的连接。
如果您继续执行您正在执行的操作,请将您的连接包装在“使用”块中。
答案 2 :(得分:0)
我使用一个模块来调用数据库,如果你使用多种形式,可以节省很多行......
这是我的模块形式:
Public cn As OleDbConnection
Public Sub InitDatabase()
Dim sDBase As String = "DB.mdb"
cn= New OleDbConnection
cn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0; Data Source=" & sDBase
End Sub
然后对于callin数据库使用这个:
Private ds As New DataSet
Private da As New OleDbDataAdapter
modWijnen.InitDatabase()
Dim cm As New OleDbCommand("Select * from Table1", cn)
da = New OleDbDataAdapter(cm)
If (ds.Tables.Contains("Table1") = False) Then
da.Fill(ds, "Table1")
End If
我希望这对你有所帮助......