2

私は非常に単純な ADO.net ヘルパー クラス (ここにコピー) を持っており、従来の adodb から ado.net に移行するのに役立ちました。つまり、使用法は非常に単純です。

Public db As New SimpleDataAccess
Public RS As New DataTable

db.ConnectionStringName = "DEV"
db.ConnectDatabase()
db.Execute_Query(RS, "SELECT * FROM whatever WHERE IntColumn = " & tools.parseint(EmployeeID, 0) & " or TextColumn = '" & db.Escape("bla'blabla") & "'")
For Each DB_Row As DataRow In RS.Rows
   response.write(DB_Row("IntColumn"))
Next
db.CloseDatabase()

現在、これはうまく機能していますが、SQLインジェクションなどを防ぐためにparseint()andEscape()関数を使用することはユーザーに依存しています(それでも大雑把な方法で)-私がやりたいのは 、何らかの方法で受け入れるExecute_NonQuery()&関数の2番目のバージョンを開発することです.Execute_Query()SqlParameter()'s

SqlParameter()'sオプションで複数をExecute_NonQuery()&メソッドに渡す最も適切な方法は何でしょうExecute_Query() か?

PS: これは .net 2.0 & .net 3.5 フレームワークでのみ使用されます

編集 1 - 私の最初の試み

私の最初の試みでは、メソッドに新しい名前 (V2) を与えただけParamListですList(Of SqlParameter)

Public Function Execute_QueryV2(ByRef TargetDataTable As DataTable, ByVal CommandText As String, Optional ByVal ParamList As List(Of SqlParameter) = Nothing, Optional ByVal CommandType As CommandType = CommandType.Text) As Boolean
    If CommandText = "" Then
        m_ErrorDesc = "Error running query: Query text was blank"
        EmailError(m_ErrorDesc)
        Return False
    Else
        Try
            NukeDataTable(TargetDataTable)
            m_db_Command = New SqlCommand(CommandText, m_db)
            m_db_Command.CommandType = CommandType
            If IsNothing(ParamList) = False Then
                For i As Integer = 0 To ParamList.Count - 1
                    m_db_Command.Parameters.Add(ParamList(i))
                Next
            End If
            m_db_DataAdapter.SelectCommand = m_db_Command
            m_db_DataAdapter.Fill(TargetDataTable)
            m_db_DataAdapter.Dispose()
            Return True
        Catch ex As Exception
            m_ErrorDesc = "Error running query: " & ex.Message & "<br /><br />Query:<hr />" & CommandText
            EmailError(m_ErrorDesc)
            Return False
        End Try
    End If
End Function

これは、次のように使用できることを意味します。

Dim QueryParameters As New List(Of SqlParameter)
QueryParameters.Add(New SqlParameter("@value", Trim(Request.QueryString("value"))))
db.Execute_QueryV2(rs, "SELECT * FROM whatever WHERE value = @value", QueryParameters)

これに関する私の唯一の問題は、私のdbクラスを使用するすべてのページにインクルードする必要System.Collections.Genericがあるということです-すべての呼び出しページに追加のインクルードを必要としない、これを行うより適切な方法はありますか?

4

1 に答える 1

1

非仮想メソッドをオーバーライドすることはできません。ただし、SimpleDataAccess クラスから派生した新しいクラスを作成し、新しいメソッドをシャドウとしてマークすることができます。また、クラスのユーザーから非表示にするには、EditorBrowsable(EditorBrowsableState.Never)属性でマークします。これで、VS インテリジェンスはそれを表示しなくなり、必要な署名を使用して新しいパブリック メソッドを作成できます。

更新 コマンドオブジェクト自体を渡します。パラメータのリストと必要なすべてのインフラストラクチャが含まれています。それが不可能な場合は、parameterName とその値のペアを含むディクショナリであるディクショナリを作成するか、値が設定された必須パラメータのリストを含む List オブジェクトを作成します。

于 2013-01-07T10:06:49.320 に答える