1

数年前、私たちは (企業として) 開発者に従来の ASP ページの作成をやめさせ、.net (そしてデータ アクセス用に system.data) に切り替えるよう求めるシナリオに直面しました。

おそらく「短期的な」対策として、system.dataとそのすべての新しいオブジェクトに慣れていない人が簡単に切り替えられるように、次のクラスを作成しました。

http://www.heavencore.co.uk/forum/viewthread.php?thread_id=185

このクラスの主な目的は、できるだけ従来の ASP と同様の使用法を維持し、使用法を非常にシンプルに保つことでした (さらに、エラー キャッチ ヤダ ヤダ ヤダの電子メール アラートを追加します)。

Public db As New SimpleDataAccess
Public RS As New DataTable

ConnectDatabase()
db.Execute_Query(RS, "SELECT * FROM whatever WHERE IntColumn = " & tools.parseint(EmployeeID, 0) & " or TextColumn = '" & db,Escape("bla'blabla") & "' ORDER BY IntColumn")
For Each DB_Row As DataRow In RS.Rows
    response.Write(DB_Row("IntColumn"))
Next
CloseDatabase()

さて、このクラスがうまくいかない主な理由は次の 2 つです。

  • Sql インジェクション (parseint と引用符のエスケープ) はクラス外で行う必要があります - 忘れがちです - パラメータ化されたクエリをここで導入する必要があります!
  • ページの最後で CloseDatabase() を手動で呼び出す必要があります - これはしばしば忘れられ、サーバーへの接続が開かれたままになります - ページのレンダリングが終了した後でも、など

このクラスが良かった理由:

  • クラスの使用法は非常に単純で、古い古典的な ASP コードを非常に簡単に .net に変換することができました。
  • クエリと接続エラーの電子メール アラートは、クラス自体で目に見えないように処理されました。
  • 2年以上完全に機能しており、問題はありません

私の質問:

このクラスを置き換えても非常に単純な使用法を保持できるようにする他のクラス/提案はありますか、またはパラメーター化されたクエリを処理するために Execute_Query() および Execute_NonQuery() メソッドを変更する最良の方法は何ですか?

シンプルさがカギ!

PS: SO の質問で使用する大量のコードを投稿するのに適した場所はどこですか? Pastebinなどは1か月間しか保持しません...

4

2 に答える 2

1

これはあなたを助けるかもしれないと思います。コードの大部分。これは、必要なほとんどすべてを処理します。パラメータを配列で渡すことができます。また、ストアド プロシージャでも使用できます。接続のクローズについて心配する必要はありません。

お役に立てれば。

于 2012-04-13T10:51:51.463 に答える
-1

http://www.fmstocks.com/ (Asp Classic 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 の完全なコード (何年にもわたってわずかに変更されています)

<!--#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

%>
于 2012-04-13T13:59:51.610 に答える