這是很多程序員都禁不住創建一個「數據庫層」與方法簽名一個變化是這個樣子:
Public DataSet ExecuteSQL(ByVal sql As String) As DataSet
這可以隔離所有這些樣板連接代碼在一個地方。一個sql命令字符串進入,數據出來。簡單。
不要這樣做!
這是朝着正確的方向,但有一個非常大的缺陷:它迫使你使用字符串操作來替換參數值到你的SQL查詢中。這導致了可怕的SQL注入安全漏洞。
相反,請確保在您的方法中包含一些機制以分別提示輸入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)
做一個函數/程序? –
請不要破壞您的問題 - 除非您即將關閉它。 –
在正常情況下,最好有一個連接到您的程序期間使用的數據庫。 – dan1111