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()

现在,虽然这很好用,但它依赖于用户使用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- 有没有一种更简便的方法来做到这一点,不需要在所有调用页面中额外包含?

4

1 回答 1

1

您不能覆盖非虚拟方法。但是,您可以创建从 SimpleDataAccess 类派生的新类并将新方法标记为 Shadows。此外,要对您的班级用户隐藏它,请使用EditorBrowsable(EditorBrowsableState.Never)属性对其进行标记。现在,VS 智能不会显示它,您可以使用所需的签名创建新的公共方法。

更新 我会传递命令对象本身。它包含参数列表和所有必需的基础设施。如果不可能,我会创建一个 Dictionary,它是一个包含对 parameterName 及其值的字典,或者一个 List 对象,其中包含设置了值的所需参数列表。

于 2013-01-07T10:06:49.320 回答