这就是很多程序员想要创建一个“数据库层”的地方,该“数据库层”具有如下所示的方法签名的变体:
Public DataSet ExecuteSQL(ByVal sql As String) As DataSet
这使您可以将所有样板连接代码隔离在一个地方。一个sql命令串进去,数据出来。简单的。
不要这样做!
这是朝着正确的方向前进,但有一个非常大的缺陷:它迫使您使用字符串操作将参数值替换到您的 sql 查询中。这会导致可怕的 sql 注入安全漏洞。
相反,请确保在方法中包含一些机制来分别提示输入 sql 参数。这通常以函数的附加参数的形式出现,并且可以像 KeyValuePairs 数组一样简单。如果您对 lambdas 感到满意,我的首选模式如下所示:
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)