讓我們先分析一下客戶端/服務器應用程序。在一個標準的客戶端/服務器應用程序中,在應用程序開始時,你能夠初始化數據庫連接字符串,這就意味著,客戶有使用數據庫連接字符串的權利,這包括用戶名和口令。但是客觀情況如果不允許你在網絡上發送這些信息的話,你就必需在不聯接數據庫的情況下直接從客戶端取得數據發送給客戶。那么解決方案之一就是在服務器上創建一個ASP頁(在本例中稱為getData.asp)接收特定格式的POST數據,它要求一個包含XML字符串,用來創建ADO對象并運行存儲過程或動態SQL語句命令。如果信息有效的話,getData.asp執行存儲過程,并返回一個XML格式的數據集、返回值列表或錯誤頁面信息的XML字符串。對于返回數據的命令,客戶端要么重新實例化要么返回值或使用XML DOM(Document Object Model文檔對象模型)格式的錯誤頁面。
好,下面就讓我們來討論一下如何實現這個頁面吧!
getData.asp頁面首先使用一個DOMDocument對象來保存客戶端發送的數據:
'創建DOMDocument對象 Set xml = Server.CreateObject ("msxml2.DOMDocument") xml.async = False
然后,它裝載POST數據
'裝載POST數據 xml.Load Request If xml.parseError.errorCode <> 0 Then Call responseError ("不能裝載XML信息。" & "Description: " & xml.parseError.reason & "<br>Line: " & xml.parseError.Line) End If
它能夠返回commandtext元素值和returndata或returnvalue元素值。下面我只給出返回commandtext元素值的代碼,其余代碼請參看我下面所附的源程序。
Set N = xml.selectSingleNode("command/commandtext") If N Is Nothing Then Call responseError ("缺少 <sp_name> 參數。") Else sp_name = N.Text End If
接著,應該讓頁面創建一個Command對象,讀入所有<param>元素,并且為request中的每一個元素創建一個參數。最后,讓頁面打開一個連接使用存儲過程adExecuteNoRecords選項來執行request。
set conn = Server.CreateObject("ADODB.Connection") conn.Mode=adModeReadWrite conn.open Application("ConnectionString") set cm.ActiveConnection=conn ' 返回數據 if not returnsData then cm.Execute else set R = server.CreateObject("ADODB.Recordset") R.CursorLocation = adUseClient R.Open cm, ,adOpenStatic, adLockReadOnly end if
如果能夠返回數據的話,那么returnData變量就為真值,并且把結果數據集返回到客戶端,仍然是一個XML文檔。
if returnsData then R.Save Response, adPersistXML if err.number <> 0 then call responseError ("數據集發生存儲錯誤" & "在命令'" & CommandText & "': " & Err.Description) Response.end end if
如果輸出參數返回值,那么這個頁面將返回一個包含這些值的XML字符串。文檔的根元素是一個<values>標記,每一個返回值都有其相應的子元素,如果發生任何錯誤,頁面都會格式化并返回一個包含錯誤信息的XML字符串:
Sub responseError(sDescription) Response.Write "<response><data>錯誤: " & sDescription & "</data></response>" Response.end End Sub
|