【发布时间】:2012-12-18 15:56:57
【问题描述】:
我有一个非常简单的 ADO.net 帮助程序类 (copy here),它帮助我们从使用经典 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() 和 Escape() 函数来防止 sql 注入等(即使是粗略的方式)——我想做的是开发第二个版本接受SqlParameter()'s 的Execute_NonQuery() 和Execute_Query() 函数
以某种方式。
将多个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 - 有没有一种更简便的方法可以在所有调用页面中都不需要额外包含?
【问题讨论】:
标签: sql vb.net ado.net overriding