通过 XMLHTTP 进行远程数据库管理
本文介绍如何通过 XMLHTTP 和 ADOX 来管理远程数据库。这对于使用虚拟主机的网站管理员来说非常有用。源代码可供下载。
远程数据库管理回顾
几年前,CGI-BIN 模块被用来管理远程数据库。但最近,CGI-BIN 已很少使用,因为它运行缓慢且难以维护。近几年,组件对象模型 (COM) 被广泛使用并且效果很好。不幸的是,在虚拟主机上注册 COM 组件并不容易。
是的,在 .NET 或 J2EE 平台,我们可以构建非常好的 N 层 Web 应用程序。但是对于网站,我们还有其他简单的方法来管理远程数据库,例如,使用 XMLHTTP 和 ADO/ADOX。
RDBA 是如何工作的
RDBA 的工作流程如下:- 客户端请求服务器执行查询。
- 服务器接收请求并执行,然后将结果返回给客户端。
- 客户端接收服务器返回的结果并显示它们。
RDBA 的两个重要方面是:
- 客户端和服务器之间用于发送命令和接收结果的通道。这就是 XMLHTTP。
- 服务器前端和数据库之间用于检索数据的中间层。这就是 ADO/ADOX。
RDBA 的工作流程如图 1 所示
使用 XMLHTTP
顾名思义,XMLHTTP 控件可以通过 HTTP 请求发送和接收 XML 信息。事实上,XMLHTTP 不止于此。它可以发送 XML、字符串、流或无符号数组格式的命令到服务器。命令也可以是 URL 的参数。它可以以 XML、字符串、流或无符号数组格式将结果发送到客户端。
在客户端使用 XMLHTTP 非常简单,只需 5 个步骤:
- 创建 XMLHTTP 对象。
- 使用指定的请求方法、URL 和服务器地址打开 XMLHTTP 连接。与 HTTP 相同,open 方法可以是 "POST" 或 "GET"。
- 将请求信息发送到服务器。
- 等待直到从服务器接收到结果。
- 释放 XMLHTTP 对象。
XMLHTTP 方法
Open bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword
bstrMethod
:用于打开连接的 HTTP 方法,例如 GET 或 POST。bstrUrl
:服务器上的请求 URL。这必须是一个绝对 URL,例如:http://Myserver/Mypath/Myfile.asp。varAsync
:一个布尔值,指示调用是否为同步。默认为True
(调用立即返回)。但通常设置为False
以等待服务器的返回结果。bstrUser
:用于身份验证的用户名。bstrPassword
:用于身份验证的密码。
Send varBody
varBody
:可接受的VARIANT
输入类型包括BSTR
、UI1(无符号字节)的SAFEARRAY
、XML 文档对象模型 (DOM) 对象的IDispatch
和IStream
。
setRequestHeader bstrHeader, bstrValue
bstrHeader
:要设置的 HTTP 头部名称。bstrValue
:头部的名称。
如果您需要 POST 数据,可以添加一个头部来告知接收方您正在发送表单数据:xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
XMLHTTP 属性
onreadystatechange
:指定当 readyState 属性发生变化时要调用的事件处理程序。responseBody
:响应实体体,作为无符号字节数组。responseStream
:将响应实体体表示为 IStream。responseText
:响应实体体,作为字符串。responseXML
:响应实体体,作为 XML 文档。
以下是我的可下载示例源代码中的片段
Function GetResult(urlStr)
Dim xmlHttp
Dim retStr
Set xmlHttp = CreateObject("Msxml2.XMLHTTP") 'create object
On Error Resume Next 'error handling
xmlHttp.Open "POST", urlStr, False
'open connection using "POST" method, asynchronously
'sending FORM data
xmlHttp.setRequestHeader "Content-Type", _
"application/x-www-form-urlencoded"
xmlHttp.Send 'send HTTP request to the server
If Err.Number = 0 Then 'if no error occurred
retStr = xmlHttp.responseText 'wait for receive response from server
Else
retStr = "Url not found" 'error message
End If
Set xmlHttp = nothing 'free the object
GetResult = retStr 'return the response to the caller
End Function
GetResult()
函数中的参数是一个 URL 字符串,它是服务器上的请求页面 URL。您可以 along with 它添加子参数,例如:
urlStr = "server.asp?cmd=" & cmd & ";db=" & db & "table=" & table
cmd
:命令,例如查询、修改、删除等。db
:服务器上的数据库名称。table
:服务器上的表名称。
如果没有发生错误,客户端现在需要做的就是坐等服务器返回响应(retStr = xmlHttp.responseText
)。
最后,GetResult()
将响应返回给调用者以显示结果。
使用哪种类型的数据?
如前所述,XMLHTTP 管道中可接受的数据传输类型有BSTR
、UI1(无符号字节)的 SAFEARRAY
、XML 文档对象模型 (DOM) 对象的 IDispatch
和 IStream
。最常用的数据类型是 XML DOM 和 STRING。您选择使用哪种数据类型取决于您的应用程序目标。
对于从远程服务器检索数据,最好在服务器和客户端都使用 XML 数据,以便处理大量数据并请求服务器添加/删除/修改/查询记录,以及在客户端进行排序/过滤。本文不重点介绍 XML COM。
本文中的示例是为使用虚拟主机的网站管理员准备的。因此,它需要两种基本能力:
- 管理远程数据库:添加/删除/修改/查询远程数据库/表/字段。
- 管理远程数据库中的数据:添加/删除/修改/查询记录。
因此,本示例侧重于通过 XMLHTTP 发送/接收 STRING。
优点很明显:
- 编程简单,类似于经典的 ASP(在服务器端与通用 ASP 相同,在客户端稍作添加 - 添加几个关于 XMLHTTP 的命令);
- 在线实现 RDBA;
- 刷新页面数据而不重新加载页面。
由于通过 STRING 进行响应,因此可以使用脚本命令 "Response.Write
" 通过 XMLHTTP 管道返回结果,服务器端无需更改。一旦服务器完成响应,客户端就可以使用 "xmlHttp.responseText
" 方法获取整个结果,并将其返回给调用者以刷新和显示页面数据。
然而,如果您使用异步模型,在点击按钮发送请求后,客户端会有一些延迟。客户端将坐等结果从服务器返回。这可以通过使用 XML DOM 对象和同步模型来避免。
使用 ADOX
ASP Web 服务通常使用 ADO 作为中间层,用于在前段和数据库之间检索数据。ADO 对象通过执行查询来实现添加/删除/修改/查询记录。这里不讨论 ADO。但是 ADO 无法管理远程数据库,例如添加/删除/修改/查询远程数据库/表/字段。应该使用 ADOX 来代替。
ADOX 是 ADO 的扩展,它提供了更多处理数据库的功能。如果您是授权的数据库管理员,您可以在数据库内执行任何操作,例如添加/删除/修改/查询数据库/表/字段/索引,添加/删除/修改组/用户/密码,以及更多...
本示例演示了:
- 生成动态 SELECT 菜单,其中包含给定路径下的数据库名称。
- 生成动态 SELECT 菜单,其中包含在第一个菜单中选定数据库下的表名称。
- 根据选定的数据库和表动态列出字段。
更改数据库的虚拟路径和 SELECT 菜单的 OnChange
处理程序将导致后续所有结果不同。刷新页面数据而不重新加载页面!
使用 Scripting.FileSystemObject
根据给定路径获取数据库。使用 ADOX 获取数据库中的表名以及表中的字段名。代码如下:
获取数据库中的表名(参数 DBName
是数据库名称)
Sub GetTables_Server(DBName)
Dim i
Dim catDB 'ADODB.Catalog object
Set catDB = Server.CreateObject("ADOX.Catalog")
'Create ADODB.Catalog object
On Error Resume Next 'Error handle
catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath(DBName)
'Open connection
'Don't forget to add your user name and
'password if needed.
If Err.Number = 0 Then 'If no error occurred
' Produce dynamic SELECT menu
Response.Write "<select name='selTable' onChange=ShowResult('fields')>"
With catDB
For i = 0 To .Tables.Count -1
If .Tables(i).Type = "TABLE" then ' If is a table
'Add the table name into the menu
Response.Write "<option value=" & .Tables(i).Name & ">" &_
.Tables(i).Name &"</option>"
End If
Next
End With
Response.Write "</select>" ' End of menu produce
Else
'Error message
Response.Write "Error: Can't open database - " & DBName
End If
Set catDB = Nothing ' Free ADODB.catalog object
End Sub
获取表中的字段名(参数 tableName 是表名)
Sub GetFields_Server(dbName, tableName)
Dim i, j
Dim catDB 'ADODB.Catalog object
Set catDB = Server.CreateObject("ADOX.Catalog")
'Create ADODB.catalog object
On Error Resume Next 'Error handle
catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath(dbName) 'Open connection
'Don't forget to add your user name and password if needed.
If Err.Number = 0 Then ' If no error occurred
'Find the table matched the table name
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
'List the fields name
With catDB.Tables(j)
For i = 0 To .Columns.Count -1
'If is primary key, then check it.
If .Columns(i).Properties("Autoincrement") = True Then
Response.Write "<input type='radio' name='field' value=" &_
.Columns(i).Name & " checked=true>" & _
.Columns(i).Name & ""
'Display the field name
Else
Response.Write "<input type='radio' name='field' value=" &_
.Columns(i).Name & ">" & .Columns(i).Name & ""
'Display the field name
End If
Next
End With
Else
'Error message
Response.Write "Error: Can't open database - " & dbName
End If
Set catDB = Nothing ' Free the ADODB.catalog object
End Sub
注意:本示例中的所有表都使用 Autoincrement
字段作为主键。如果您的表中的主键不是 Autoincrement
类型,或者您的表没有主键,您应该重写上述代码。在我看来,使用 Autoincrement
字段作为主键是一个好习惯。
使用示例
GOIS RDBA 的屏幕截图如图 2 所示。系统要求
要运行此示例,您的 PC 上应安装以下软件:Windows 98/Me/XP/2000 MSXML 4.0 MS Access 2000,IE 5.5 或更高版本。
安装和执行
- 下载示例 ZIP 文件 - supervisor.zip。
- 将文件解压到您的 IIS 中的某个路径下,例如:C:\Inetpub\wwwroot\supervisor
- 在 IE 的 URL 地址栏输入 "localhost/supervisor/supervisor.asp",然后 GO。
- 通过稍作修改,例如更改路径,授权用户,您可以将此示例源代码上传到您的虚拟主机来管理您自己的数据库。
下载的 ZIP 文件中有几个示例数据库和两个源文件。示例数据库将自动解压到工作路径下的 "database" 文件夹中,例如:/supervisor/database
两个源文件是:
- 在服务器上运行的服务页面代码:server.asp
- 在客户端运行的客户端页面代码:supervisor.asp
演示中按钮的功能
- 刷新:刷新数据库路径。重写路径并按此按钮将导致后续所有结果不同。
- 列表:列出所选字段的内容。
- Max:获取 MAX 值并将其显示在 ID 编辑器中。选择表后会自动调用。
- Count:计算所选字段的数量。
- Show:获取并显示由 ID 和选定字段指定的。内容。
- Modify:修改由 ID 和选定字段指定的。内容。
- Delete:删除由 ID 指定的记录。
- SQL:执行在(上部)文本编辑器中输入的 SQL 查询。下部的文本编辑器将显示执行结果。
- +:展开/折叠文本编辑器。
结语
本文介绍了如何通过 XMLHTTP 和 ADOX 远程管理数据库。这对于使用虚拟主机的网站管理员来说非常有用。我将添加其他功能。如果您有任何问题或建议,请随时给我写信:lianbo@gois.ws,或在我的网站上留言:http://eng.gois.ws/
编程愉快!