我想知道避免以下情况的最基本方法是什么。
con.ConnectionString = connection_String
con.Open()
cmd.Connection = con
'database interaction here
cmd.Close()
我一直在我的项目中制作这些行,但我认为必须有更好的方法来节省一遍又一遍的输入。它使代码看起来比现在更加草率!
结束了这个,对我来说效果很好。感谢您的帮助:)
Public Sub connectionState()
If con.State = 0 Then
con.ConnectionString = connection_String
con.Open()
cmd.Connection = con
Else
con.Close()
End If
End Sub
最佳答案
这就是许多程序员想要创建一个“数据库层”的地方,方法签名的变体看起来像这样:
Public DataSet ExecuteSQL(ByVal sql As String) As DataSet
这允许您将所有样板连接代码隔离在一个地方。一个sql命令串进去,数据出来。很简单。
不要这样做!
这是朝着正确的方向前进,但有一个很大的缺陷:它迫使您使用字符串操作来将参数值替换到您的 sql 查询中。这会导致可怕的 SQL 注入(inject)安全漏洞。
相反,请确保在您的方法中包含一些机制来分别提示输入 sql 参数。这通常以函数的附加参数的形式出现,并且可以像 KeyValuePairs 数组一样简单。如果您熟悉 lambda,我喜欢的模式如下所示:
Public Iterator Function GetData(Of T)(ByVal sql As String, ByVal addParameters As Action(Of SqlParameterCollection), ByVal translate As Func(Of IDatarecord, T)) As IEnumerable(Of T)
Using cn As New SqlConnection("connection string"), _
cmd As New SqlCommand(sql, cn)
addParameters(cmd.Parameters)
cn.Open()
Using rdr As SqlDataReader = cmd.ExecuteReader()
While rdr.Read()
Yield(translate(rdr))
End While
End Using
End Using
End Function
要调用该函数,您可以这样做:
Dim bigCustomers = GetData("SELECT * FROM Customers WHERE SalesTotal > @MinSalesTotal", _
Sub(p) p.Add("@MinSalesTotal", SqlDbType.Decimal, 1000000), _
MyCustomerClass.FromIDataRecord)
关于sql - 打开/关闭 sql 连接 - 冗余代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12801472/