我有一个非常简单的 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()
现在,虽然这很好用,但它依赖于用户使用parseint()
andEscape()
函数来防止 sql 注入等(甚至以粗略的方式) - 我想做的是开发
以某种方式接受的Execute_NonQuery()
&Execute_Query()
函数的第二个版本SqlParameter()'s
.
将 mutlipleSqlParameter()'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
- 有没有一种更简便的方法来做到这一点,不需要在所有调用页面中额外包含?