Asp.net 改进数据访问类

Asp.net 改进数据访问类,asp.net,sql-server,vb.net,tsql,ado.net,Asp.net,Sql Server,Vb.net,Tsql,Ado.net,几年前,我们(作为一家公司)面临这样一种情况:让我们的开发人员停止编写经典的asp页面,转而使用.net(反过来使用system.data进行数据访问) 作为一种所谓的“短期”度量,我编写了以下类,以使那些不习惯system.data及其所有新对象的人更容易进行切换: 该类的主要目的是尽可能保持与经典asp的使用方式类似,并保持使用方式非常简单(此外,还可以添加电子邮件警报以捕获错误yada yada yada): 公共数据库作为新的SimpleDataAccess 公共RS作为新的数据表 C

几年前,我们(作为一家公司)面临这样一种情况:让我们的开发人员停止编写经典的asp页面,转而使用.net(反过来使用system.data进行数据访问)

作为一种所谓的“短期”度量,我编写了以下类,以使那些不习惯system.data及其所有新对象的人更容易进行切换:

该类的主要目的是尽可能保持与经典asp的使用方式类似,并保持使用方式非常简单(此外,还可以添加电子邮件警报以捕获错误yada yada yada):

公共数据库作为新的SimpleDataAccess
公共RS作为新的数据表
ConnectDatabase()
db.Execute_Query(RS,“从IntColumn=“&tools.parseint(EmployeeID,0)&”或TextColumn='”的任何位置选择*”&db,Escape(“bla'bla”)&“按IntColumn排序”)
对于每个DB_行作为RS.行中的DataRow
Write(DB_行(“IntColumn”))
下一个
CloseDatabase()
现在,这门课糟糕的两个主要原因是:

  • Sql注入(parseint和quote-escaping)必须在类之外完成-容易忘记-这里绝对需要引入参数化查询
  • CloseDatabase()必须在页面结束时手动调用-这通常会被忘记,并且与服务器的连接保持打开状态-即使在页面完成渲染等之后
这门课好的原因是:

  • 该类的使用非常简单,可以很容易地将旧的经典asp代码转换为.net
  • 查询和连接错误的电子邮件警报在类本身中进行了不可见的处理
  • 它已经完美地工作了2年多了,没有问题
我的问题:

有没有其他类/建议允许我替换这个类但保留非常简单的用法,或者修改Execute\u Query()和Execute\u NonQuery()方法以处理参数化查询的最佳方法

简单是关键

PS:哪里是发布大量代码以用于SO问题的好地方?Pastebin等只保存一个月的东西…

我想可能会对你有所帮助。一大块代码。这几乎可以处理您需要的所有事情。可以在数组中传递参数。也可以与存储过程一起使用。无需担心连接关闭


希望这有帮助

我一直使用来自(Asp经典MS应用程序示例)的函数。它非常简单,可以处理参数

用法示例:

set rs = RunSQLReturnRs("Select * from Usuario where UsuarioID = ?", _
                        array(mp("@UsuarioID", adInteger, 0, UsuarioID)))
If not rs.eof then
    UsuarioName = rs("FullName")
end if 
DbHelper.ASP完整代码(多年来略有修改)


0那么
BuildErrorMessage()
退出功能
如果结束
'断开记录集
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
设置rs.ActiveConnection=Nothing
'返回结果记录集
设置RunSPReturnRS=rs
端函数
函数RunSP(strSP,params())
出错时继续下一步
'创建ADO对象
Dim命令
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=strSP
cmd.CommandType=adCmdStoredProc
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'执行查询而不返回记录集
cmd.Execute,adExecuteNoRecords
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
'断开记录集并清理
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
退出功能
端函数
函数RunSQL(strSP,params())
出错时继续下一步
'创建ADO对象
Dim命令
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=strSP
cmd.CommandType=adCmdText
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'执行查询而不返回记录集
cmd.Execute,adExecuteNoRecords
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
"清理",
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
退出功能
端函数
函数RunSQLReturnRS(sqlstmt,params())
出错时继续下一步
'创建ADO对象
Dim rs,cmd
Set rs=server.createobject(“ADODB.Recordset”)
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=sqlstmt
cmd.CommandType=adCmdText
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'执行只读的查询
rs.CursorLocation=adUseClient
rs.Open cmd、adOpenForwardOnly、adLockReadOnly
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
'断开记录集
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
设置rs.ActiveConnection=Nothing
'返回结果记录集
设置RunSQLReturnRS=rs
端函数
函数RunSPReturnInteger(strSP,params())
出错时继续下一步
'创建ADO对象
Dim命令
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=strSP
cmd.CommandType=adCmdStoredProc
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'假设最后一个参数是传出的
cmd.Parameters.Append cmd.CreateParameter(“@retval”,adInteger,adParamOutput,4)
'在没有结果记录集的情况下执行并拉出“return value”参数
cmd.Execute,adExecuteNoRecords
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
RunSPReturnInteger=cmd.Parameters(“@retval”).Value
'断开记录集,然后
<!--#include file="../bus/adovbs.inc"-->
<%
Function GetConnectionString()
    GetConnectionString = "file name=c:\udl\miconnstring.udl"
End Function

Function mp(PName , PType , PSize, PValue)
    mp = Array(PName, PType, PSize, PValue)
End Function

Function RunSPReturnRS(strSP, params())
    On Error Resume next

    ' Create the ADO objects
    Dim rs , cmd
    Set rs = server.createobject("ADODB.Recordset")
    Set cmd = server.createobject("ADODB.Command")

    ' Init the ADO objects  & the stored proc parameters
    cmd.ActiveConnection = GetConnectionString()
    cmd.CommandText = strSP
    cmd.CommandType = adCmdStoredProc
    cmd.CommandTimeout = 900 ' 15 minutos

    collectParams cmd, params

    ' Execute the query for readonly
    rs.CursorLocation = adUseClient
    rs.Open cmd, , adOpenForwardOnly, adLockReadOnly

    If err.number > 0 then
        BuildErrorMessage()
        exit function
    end if

    ' Disconnect the recordset
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing
    Set rs.ActiveConnection = Nothing

    ' Return the resultant recordset
    Set RunSPReturnRS = rs

End Function

Function RunSP(strSP , params())
    On Error resume next

    ' Create the ADO objects
    Dim cmd
    Set cmd = server.createobject("ADODB.Command")

    ' Init the ADO objects & the stored proc parameters
    cmd.ActiveConnection = GetConnectionString()
    cmd.CommandText = strSP
    cmd.CommandType = adCmdStoredProc
    cmd.CommandTimeout = 900 ' 15 minutos
    collectParams cmd, params

    ' Execute the query without returning a recordset
    cmd.Execute , , adExecuteNoRecords
    If err.number > 0 then
        BuildErrorMessage()
        exit function
    end if


    ' Disconnect the recordset and clean up
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing

    Exit Function

End Function

Function RunSQL(strSP , params())
    On Error resume next

    ' Create the ADO objects
    Dim cmd
    Set cmd = server.createobject("ADODB.Command")

    ' Init the ADO objects & the stored proc parameters
    cmd.ActiveConnection = GetConnectionString()
    cmd.CommandText = strSP
    cmd.CommandType = adCmdText
    cmd.CommandTimeout = 900 ' 15 minutos
    collectParams cmd, params

    ' Execute the query without returning a recordset
    cmd.Execute , , adExecuteNoRecords
    If err.number > 0 then
        BuildErrorMessage()
        exit function
    end if

    ' Cleanup
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing

    Exit Function

End Function

Function RunSQLReturnRS(sqlstmt, params())
    On Error Resume next

    ' Create the ADO objects
    Dim rs , cmd
    Set rs = server.createobject("ADODB.Recordset")
    Set cmd = server.createobject("ADODB.Command")

    ' Init the ADO objects  & the stored proc parameters
    cmd.ActiveConnection = GetConnectionString()
    cmd.CommandText = sqlstmt
    cmd.CommandType = adCmdText
    cmd.CommandTimeout = 900 ' 15 minutos

    collectParams cmd, params

    ' Execute the query for readonly
    rs.CursorLocation = adUseClient
    rs.Open cmd, , adOpenForwardOnly, adLockReadOnly
    If err.number > 0 then
        BuildErrorMessage()
        exit function
    end if

    ' Disconnect the recordset
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing
    Set rs.ActiveConnection = Nothing

    ' Return the resultant recordset
    Set RunSQLReturnRS = rs

End Function


Function RunSPReturnInteger(strSP , params())
    On Error resume next

    ' Create the ADO objects
    Dim cmd
    Set cmd = server.createobject("ADODB.Command")

    ' Init the ADO objects & the stored proc parameters
    cmd.ActiveConnection = GetConnectionString()
    cmd.CommandText = strSP
    cmd.CommandType = adCmdStoredProc
    cmd.CommandTimeout = 900 ' 15 minutos
    collectParams cmd, params

    ' Assume the last parameter is outgoing
    cmd.Parameters.Append cmd.CreateParameter("@retval", adInteger, adParamOutput, 4)

    ' Execute without a resulting recordset and pull out the "return value" parameter
    cmd.Execute , , adExecuteNoRecords
    If err.number > 0 then
        BuildErrorMessage()
        exit function
    end if
    RunSPReturnInteger = cmd.Parameters("@retval").Value

    ' Disconnect the recordset, and clean up
    Set cmd.ActiveConnection = Nothing
    Set cmd = Nothing

    Exit Function
End Function

Private Sub collectParams(cmd , argparams())
    Dim params , v
    Dim i , l , u

    params = argparams


    For i = LBound(params) To UBound(params)
        l = LBound(params(i))
        u = UBound(params(i))

        ' Check for nulls.
        If u - l = 3 Then
            If VarType(params(i)(3)) = vbString Then
                If params(i)(3) = "" then
                    v = null
                else
                    v = params(i)(3)
                end if
            Else
                v = params(i)(3)
            End If

            If params(i)(1) = adLongVarChar Then
                Dim p 'As New Parameter
                Set p = cmd.CreateParameter(params(i)(0), params(i)(1), adParamInput)
                p.Attributes = adParamLong + adParamSigned
                If Not IsNull(v) Then
                    'Seteo para text columns is not null
                    p.AppendChunk v
                    p.Size = Len(v)
                Else
                    'Seteo para text columns is null
                    p.Value = v
                    p.Size = 10000
                End If
                cmd.Parameters.Append p
            Else
                cmd.Parameters.Append cmd.CreateParameter(params(i)(0), params(i)(1), adParamInput, params(i)(2), v)
            End If
        Else
            RaiseError m_modName, "collectParams(...): incorrect # of parameters"
        End If
    Next
End Sub

%>