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 工作流图如下:
使用 XMLHTTPXMLHTTP 用于通过 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 sampleA 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