1

OK、SQL関数を呼び出して出力を返すクラシックASP関数を作成しようとしています。パラメータ化されたADODB接続を使用しようとしていますが、これらがどのように機能するのかよくわかりません。正しい方法を学ぼうとしています。

SQL関数は、2つの文字列入力を受け取ります。一方は「ソルト」で、もう一方は実際のテキストであり、16進数に変換します。SQLでは正常に動作しますが、従来のASPでは動作しません。

引き続き、ADODB.Commandエラー「800a0cc1」

要求された名前または序数に対応するコレクションにアイテムが見つかりません。

Sub Encrypt(plainString)
    strSQL = "SET NOCOUNT ON;SELECT dbo.Encrypt('xx', '?') as keycode"
    Set cnnEncrypt = Server.CreateObject("ADODB.Connection")
    cnnEncrypt.open CONNSTRING

    Dim cmd1
    Set cmd1 = Server.CreateObject("ADODB.Command")
    cmd1.ActiveConnection = cnnEncrypt
    cmd1.CommandText = strSQL
    cmd1.CommandType = adCmdText
    cmd1.Parameters(0) = plainString      (**Original Error Occured Here!!!!**)
    Set rsEncrypt = cmd1.Execute()

    If not rsEncrypt.EOF Then
        Encrypt = rsEncrypt.Fields("keycode").Value
    Else
        Encrypt = "blank"
    End If

    ' Clean Up    
    rsEncrypt.Close    
    Set rsEncrypt = Nothing    
    cnnEncrypt.Close    
    Set cnnEncrypt = Nothing    

End Sub

「CheranShunmugavel」の回答を確認した後の新しい作業バージョン。このように現場に電話する

<%Response.Write Decrypt(Encrypt( "test"))%>

暗号化されたコードはバイナリであるため、ページに印刷できません。BinarytoString関数が必要になります。関数に値を返したいので、SubからFunctionに変換しました。

Function Encrypt(byVal plainString)
    strSQL = "SET NOCOUNT ON;SELECT dbo.Encrypt('xx', ?) as keycode"
    Set cnnEncrypt = Server.CreateObject("ADODB.Connection")
    cnnEncrypt.open CONNSTRING

    Dim cmd1
    Set cmd1 = Server.CreateObject("ADODB.Command")
    cmd1.ActiveConnection = cnnEncrypt
    cmd1.CommandText = strSQL
    cmd1.CommandType = adCmdText
    cmd1.Parameters.Append cmd1.CreateParameter("", adVarChar, adParamInput, Len(plainString)+1, plainString)  
    Set rsEncrypt = cmd1.Execute()

    If not rsEncrypt.EOF Then
        Encrypt = rsEncrypt.Fields("keycode").Value
    Else
        Encrypt = "blank"
    End If

    ' Clean Up    
    rsEncrypt.Close    
    Set rsEncrypt = Nothing    
    cnnEncrypt.Close    
    Set cnnEncrypt = Nothing    
End Function

そして、これが復号化機能です。

Function Decrypt(byVal plainString)
    strSQL = "SET NOCOUNT ON;SELECT dbo.Decrypt('xx', ?) as keycode"
    Set cnnDecrypt = Server.CreateObject("ADODB.Connection")
    cnnDecrypt.open CONNSTRING

    Dim cmd1
    Set cmd1 = Server.CreateObject("ADODB.Command")
    cmd1.ActiveConnection = cnnDecrypt
    cmd1.CommandText = strSQL
    cmd1.CommandType = adCmdText
    cmd1.Parameters.Append cmd1.CreateParameter("", adVarBinary, adParamInput, LenB(plainString)+1, plainString)  
    Set rsDecrypt = cmd1.Execute()

    If not rsDecrypt.EOF Then
        Decrypt = rsDecrypt.Fields("keycode").Value
    Else
        Decrypt = "blank"
    End If

    ' Clean Up    
    rsDecrypt.Close    
    Set rsDecrypt = Nothing    
    cnnDecrypt.Close    
    Set cnnDecrypt = Nothing    
End Function
4

1 に答える 1

2

First off, you don't need delimiters around the parameter placeholder. SQL Server will handle it appropriately.

strSQL = "SET NOCOUNT ON;SELECT dbo.Encrypt('xx', ?) as keycode"

Secondly, the Parameters collection is initially empty and must be populated before you try to access it (i.e., the line cmd1.Parameters(0) = plainString). There are several ways of doing this, but I prefer creating the parameters manually using the CreateParameter method:

cmd1.Parameters.Append cmd1.CreateParameter("", adVarChar, adParamInput, Len(plainString), plainString)

Also, it's not apparent from your code, but make sure you've got the ADO constants defined, either by referencing the type library, or by including adovbs.inc.

于 2012-10-27T05:59:11.680 に答える