【问题标题】:Tidy way of passing ADO.net SqlParameters to a method as an optional list/array/other将 ADO.net SqlParameters 作为可选列表/数组/其他传递给方法的整洁方式
【发布时间】: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()'sExecute_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


    【解决方案1】:

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

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

    【讨论】:

    • 有趣,但是我的问题的主要部分实际上是如何最好地接受参数作为方法参数并通过 sql 命令在方法中使用这些参数 - 即我已经看到了一些传递参数的示例通过数组等,但这些看起来很复杂 - 你将如何处理我的问题的那部分?
    • 干杯,我第一次尝试使用List() 编辑了我的问题 - 这个类的重点是避免在页面级别处理命令对象 - 这就是我'已经尝试在我的第一次编辑中进行 - 但是你会注意到我现在有一个关于 System.Collections.Generic 的新问题 - 有什么想法吗?
    • @HeavenCore,我不清楚您在页面中包含 System.Collections.Generic 命名空间的问题。无论如何,如果你不喜欢添加这个命名空间,你可以创建一个新的类来保存 SQLParameters 列表。因此,您仍将具有类型安全性并从所有页面页面中隐藏 System.Collections.Generic 命名空间。同时,您的方法现在应该接受您自己的包含 SQLParameters 列表的类实例并使用它。
    猜你喜欢
    • 2012-10-31
    • 2013-01-24
    • 2016-12-31
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多