xml|資料|資料庫
A Review of Remote Database Administer
幾年之前, CGI-BIN 模組被用作遠端管理資料庫。現在, CGI-BIN 用得越來越少了,原因是它運行速度很慢,而且難於維護。
近幾年,元件物件模型 (COM) 得到了廣泛的運用,不幸的是,在虛擬機器主機上註冊 COM 組件是一件很麻煩的事。
在 .NET 或 J2EE 平台上, 我們可以很方便地開發n層結構的 Web 應用程式。但是對於網站來說,我們有更方便的方法遠端管理資料庫,例如:運用 XMLHTTP 和 ADO/ADOX.
RDBA 如何工作
RDBA's 的工作流程如下:
1 用戶端向伺服器發出一個查詢請求。
2 伺服器接受並執行之,然後傳回值到用戶端。
3 用戶端從伺服器接受結果並顯示之。
RDBA 依賴的兩個技術:
1 用戶端和伺服器互動(發送命令,返回結果)的通道: XMLHTTP.
2 伺服器上用於擷取資料的中介層: ADO/ADOX.
RDBA's 工作流程圖如下:
使用 XMLHTTP
XMLHTTP 用於通過 HTTP 要求來發送或接受 XML 資訊。
實際上 XMLHTTP 還有其他的很多用途。
你可以用它來向伺服器發送命令(可用 XML, string, stream, 或 unsigned array). 命令也可以作為 URL 的參數
還可以向用戶端發送結果資訊( XML, string, stream, 或 unsigned array)
更多資訊請參考:
在用戶端使用 XMLHTTP 很簡單,只有 5 步:
1. 建立 XMLHTTP 對象。
2. 指定方法,URL,以及驗證,對伺服器開啟 XMLHTTP。 開啟方法可以是 "POST" 或 "GET"。
3. 向伺服器發送 request 資訊。
4. 等待,直到從伺服器接受到結果。
5. 釋放 XMLHTTP 對象。
XMLHTTP 方法:
Open bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword
bstrMethod: 用於開啟串連的 HTTP 方法,如 GET 或 POST
bstrUrl: 請求的伺服器上的 URL,如:http://Myserver/Mypath/Myfile.asp。
varAsync: 邏輯型。表示是否同步調用。預設為 true (調用立刻返回)。 但通常將它設為 false ,以便等待伺服器的傳回值。
bstrUser: 身分識別驗證的使用者名稱資訊。
bstrPassword: 身分識別驗證的密碼資訊。
Send varBody
varBody: 類型可以為:BSTR, SAFEARRAY of UI1 (unsigned bytes), XML DOM 對象的IDispatch介面, 或 IStream。
setRequestHeader bstrHeader, bstrValue
bstrHeader: 要設定的 HTTP 頭的名字。
bstrValue: HTTP 頭的值。
如果要 POST 資料,可以添加一個 HTTP 頭,以便告訴接受方正在發送資料:
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
XMLHTTP 屬性:
onreadystatechange: 指定 readyState 屬性改變時調用的事件處理函數。
responseBody: 以無符號位元組數組的形式 response
responseStream: 以 IStream 的形式 response
responseText: 以字串的形式 response
responseXML: 以 XML 文檔 response
下面是代碼片斷:
Function GetResult(urlStr) Dim xmlHttp Dim retStr Set xmlHttp = CreateObject("Msxml2.XMLHTTP") '建立對象 On Error Resume Next '錯誤處理 xmlHttp.Open "POST", urlStr, False '用 "POST" 方法非同步開啟串連 '發送表單資料 xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" xmlHttp.Send '向伺服器發送 HTTP 要求 If Err.Number = 0 Then '如果成功 retStr = xmlHttp.responseText '等待從伺服器接受資料 Else retStr = "地址未發現" '錯誤資訊 End If Set xmlHttp = nothing '釋放對象 GetResult = retStr '返回 response 給調用者End Function
GetResult() 函數的參數是要請求的 url, 你可以添加子參數,如:
urlStr = "server.asp?cmd=" & cmd & "&db=" & db & "table=" & table
cmd: 命令類型,如:query, modify, delete 等
db: 伺服器上的資料庫名
table: 表名
使用何種資料類型?
正如上面所說,通過 XMLHTTP 通道傳送的資料可以有很多種類型。其中用的最多的是 XML DOM 和 STRING。
選用何種資料類型取決於程式的需要。
為了從伺服器取得資料,用戶端和伺服器都使用 XML 資料是一個很好的方法。因為這樣可以處理大量的資料,請求伺服器添加/刪除/修改/查詢 記錄,或在用戶端排序/過濾資料。
本文的目的是為了在虛擬機器主機上遠端管理資料庫,所以這需要有如下兩個功能:
1. 遠端管理資料庫:添加/刪除/修改/查詢 遠端資料庫/表/欄位。
2. 遠端管理資料庫中的資料: 添加/刪除/修改/查詢 記錄
所以這裡我們使用 XMLHTTP 來發送/接受 字串
這樣做的好處很明顯:可以無閃爍重新整理頁面
由於是採用字串, 所以可以簡單的使用 "Response.Write" 來返回結果。一旦伺服器 response 完畢,用戶端用 "xmlHttp.responseText" 方法來擷取整個結果,並返回給調用者,用於重新整理頁面資料。
如果採用非同步方式,則用戶端按下按鈕後,會有一定的延時,用戶端必須等待返回資料。如果採用非同步或使用 XML DOM 則可以避免這一點。
Using ADOX
ADO 不能用來遠端管理資料庫,我們可以使用 ADOX。
ADOX 是 ADO 的擴充, 它提供了更多的函數用於處理資料庫。一旦通過身份認證,並且你的角色為資料庫管理員,那麼你可以通過 ADOX 作任何操作。
This sample requests:
產生動態 select 菜單,顯示指定路徑下的資料庫名。
產生動態 select 菜單,顯示上述菜單中選定的資料庫中的表名。
根據選定的資料庫和表,動態列出欄位名。
根據虛擬目錄路徑的改變和 select 的改變,即時的改變顯示的內容而且無閃爍的重新整理頁面。
使用 Scripting.FileSystemObject 獲得給定路徑的資料庫名。 使用 ADOX 擷取表名和欄位名。代碼如下:
擷取一個資料庫中的表名:
Sub GetTables_Server(DBName) Dim i Dim catDB 'ADODB.Catalog 對象 Set catDB = Server.CreateObject("ADOX.Catalog") '建立 ADODB.Catalog 對象 On Error Resume Next '錯誤處理 catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & Server.MapPath(DBName) '開啟串連 '如果需要可加上使用者名稱和密碼 If Err.Number = 0 Then '成功 ' 動態產生 select 選單 Response.Write "<select name='selTable' onChange=ShowResult('fields')>" With catDB For i = 0 To .Tables.Count -1 If .Tables(i).Type = "TABLE" then ' 如果是一個表 '將表名添加到 select Response.Write "<option value=" & .Tables(i).Name & ">" &_ .Tables(i).Name &"</option>" End If Next End With Response.Write "</select>" ' select 輸出完畢 Else '錯誤資訊 Response.Write "錯誤: 不能開啟資料庫 - " & DBName End If Set catDB = Nothing ' 釋放 ADODB.catalog 對象End Sub
擷取表中的欄位名:
Sub GetFields_Server(dbName, tableName) Dim i, j Dim catDB 'ADODB.Catalog 對象 Set catDB = Server.CreateObject("ADOX.Catalog") '建立 ADODB.catalog 對象 On Error Resume Next '錯誤處理 catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & Server.MapPath(dbName) '開啟串連 '如有必要在此添加使用者名稱和密碼 If Err.Number = 0 Then ' 成功 '找到匹配的表名 With catDB For j = 0 To .Tables.Count -1 If (.Tables(j).Type = "TABLE") and (.Tables(j).Name = tableName) Then Exit For End If Next End With '列出欄位名 With catDB.Tables(j) For i = 0 To .Columns.Count -1 '如果是主鍵,選中之 If .Columns(i).Properties("Autoincrement") = True Then Response.Write "<input type='radio' name='field' value=" &_ .Columns(i).Name & " checked=true>" & .Columns(i).Name & "" '顯示欄位名 Else Response.Write "<input type='radio' name='field' value=" &_ .Columns(i).Name & ">" & .Columns(i).Name & "" '顯示欄位名 End If Next End With Else 'Error message Response.Write "錯誤: 不能開啟資料庫 - " & dbName End If Set catDB = Nothing ' 釋放 ADODB.catalog 對象End Sub
註:本例中所有的表採用了自增欄位作為主鍵。如果你的資料庫中未採用自增欄位作為主鍵或未指定主鍵,則需要重寫上述代碼。使用自增欄位作為主鍵是一個很好的習慣。
Use the sample
A screenshot of GOIS RDBA is showed as Fig. 2.
System required:
To run this sample, the follows should be installed on your PC:
Windows 98/Me/XP/2000,MSXML 4.0,MS Access 2000,IE 5.5 or above.
Install and execute:
1. Download the sample ZIP file - supervisor.zip.
2. Unzip the file under a path in your IIS, for example: C:\Inetpub\wwwroot\supervisor。
3. Input "localhost/supervisor/supervisor.asp" in the url address on your IE, then GO.
4. By a little changing, such as change the path, authorize the user, you can upload this sample source to your virtual hosting to administer your own database.
There are several sample databases and two source files in the downloadable ZIP file.
The sample databases will automatically unzip to a "database" path under the working path, for example:
/superviosr/database。
兩個源檔案是:
伺服器端: server.asp
用戶端: supervisor.asp
下載來源程式 - 143 Kb