私は非常に単純な 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
があるということです-すべての呼び出しページに追加のインクルードを必要としない、これを行うより適切な方法はありますか?