2012-10-26 71 views
1

好吧,我正在嘗試編寫一個傳統的ASP函數,它將調用SQL函數並返回輸出。 我想使用參數化ADODB連接,但我不太清楚這些工作是如何實現的。試圖學習正確的方法。通過傳統的ASP函數執行用戶定義函數

SQL函數只需要兩個字符串輸入,其中一個是「鹽」,另一個是實際文本並將其轉換爲十六進制。 在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 

回顧「Cheran Shunmugavel」後的新工作版本答案。 調用上這樣的網站

<%的Response.Write解密器(Encrypt(「測試」))%>

不能打印的加密代碼的網頁,因爲它是二進制。你需要一個Binary to String函數。 我從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 

回答

2

首先,你不需要圍繞參數佔位符的分隔符。 SQL Server會適當地處理它。

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

其次,Parameters集合最初是空的,必須填入您嘗試訪問它之前(即行cmd1.Parameters(0) = plainString)。有這樣做的幾種方法,但我更喜歡使用的CreateParameter方法手動創建的參數:

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

而且,這不是明顯的從你的代碼,但要確保你有定義的ADO常量,通過referencing the type libraryincluding adovbs.inc

+0

使用新版本的代碼更接近地更新問題,並標記之前發生錯誤的位置。感謝您解釋自那以來造成的那種參數錯誤。該頁面包含adovbs.inc。進行更改後,我仍然無法獲得所需的結果,無法在頁面上打印加密的代碼或存儲在變量中。我只是在閱讀或者說錯了,大約凌晨3點左右,也許我完全錯過了它。星期一會更好看:)。 – Maramor

+0

好吧,上面沒有任何問題,我相信問題是從函數返回的數據是二進制字段,我不能簡單地將它寫入屏幕。所以我想我需要某種二進制字符串轉換。 – Maramor

+0

解決了我所有的問題,至少與這部分相關:)。謝謝Cheran的幫助。 – Maramor