質問へのコメントでこれを開始しましたが、大幅に改善されたデータ アクセス クラスの開始点をお見せしましょう。
Public Class SqlDataHelper
Private Property ConnectionString() As String
Get
'return the connection string, perhaps read/cached from a config file
'I'll often require this as an argument to the class constructor as well
End Get
'May not need a setter, depending on how you build this
End Property
Private Function GetConnection() As SqlConnection
GetConnection = New SqlConnection(ConnectionString)
GetConnection.Open()
End Function
Private Function GetDataTable(ByVal query As String, ByVal ParamArray args() As SqlParameter) As DataTable
Dim ds As New DataTable
Dim cmd As New SqlCommand(query, GetConnection())
If args IsNot Nothing Then
For Each p As SqlParameter In args
cmd.Parameters.Add(p)
Next p
End If
Dim da As New SqlDataAdapter(cmd)
da.Fill(dt)
Return dt
End Function
Private Function UpdateData(ByVal command As String, ByVal ParamArray args() As SqlParameter) As Integer
Using cn As SqlConnection = GetConnection(), _
cmd As New SqlCommand(command, cn)
If args IsNot Nothing Then
For Each p As SqlParameter In args
cmd.Parameters.Add(p)
Next p
End If
Return cmd.ExecuteNonQuery()
End Function
Private Function GetSingleValue(ByVal query As String, ByVal ParamArray args() As SqlParameter) As Object
Using cn As SqlConnection = GetConnection(), _
cmd As New SqlCommand(query, cn)
If args IsNot Nothing Then
For Each p As SqlParameter In args
cmd.Parameters.Add(p)
Next p
End If
Return cmd.ExecuteScalar()
End Function
Public Function ReadFunctionID() As DataTable
Return GetDataTable("SELECT fld_functionid FROM tbl_users_function_permission", Nothing)
End Function
Public Function ReadFunctionIDByUser(ByVal UserID As Integer) As DataTable
Return GetDataTable("SELECT fld_functionid FROM tbl_users_function_permission WHERE UserID = @UserID", _
New SqlParameter("@UserID", UserID))
End Function
End Class
このコードの改善点のいくつかを詳しく見てみましょう。まず、パブリックとプライベートの違いに注意してください。プレゼンテーション層からアドホック SQL 文字列を受け入れたいと思うことは決してありません。これは、アドホック SQL を使用できないという意味ではなく、データ セクションとプレゼンテーション セクションを分けておきたいということです。
クラスの最後の 2 つの関数がパラメーター データを処理する方法を見てみましょう。Nothing
パラメータを使用しない場合は明示的に使用する必要があるという事実は、このコードの特徴です。クエリ パラメーターを使用する必要があることを常に思い出させてくれます。SQL インジェクションとは何か、またそれを防ぐ方法がわからない場合は、データベース コードを書くべきではありません。
これがお役に立てば幸いです。