これは、多くのプログラマーが、次のようなメソッド シグネチャのバリエーションを持つ「データベース レイヤー」を作成する誘惑に駆られる場所です。
Public DataSet ExecuteSQL(ByVal sql As String) As DataSet
これにより、ボイラープレート接続コードをすべて 1 か所に分離できます。SQL コマンド文字列が入り、データが出てきます。簡単。
それをしないでください!
これは正しい方向に向かっていますが、非常に大きな欠点が 1 つあります。文字列操作を使用して、パラメーター値を SQL クエリに代入する必要があります。これは、恐ろしい sql インジェクション セキュリティの脆弱性につながります。
代わりに、メソッドに何らかのメカニズムを含めて、SQL パラメータを個別に入力するようにしてください。これは通常、関数への追加の引数の形式で提供され、KeyValuePairs の配列と同じくらい単純な場合があります。ラムダに慣れている場合、私の好みのパターンは次のようになります。
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)