65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 XMLHTTP 进行远程数据库管理

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2002 年 8 月 1 日

CPOL

8分钟阅读

viewsIcon

94815

downloadIcon

1116

本文介绍如何通过 XMLHTTP 和 ADOX 来管理远程数据库。这对于使用虚拟主机的网站管理员来说非常有用。源代码可供下载。

远程数据库管理回顾

几年前,CGI-BIN 模块被用来管理远程数据库。但最近,CGI-BIN 已很少使用,因为它运行缓慢且难以维护。

近几年,组件对象模型 (COM) 被广泛使用并且效果很好。不幸的是,在虚拟主机上注册 COM 组件并不容易。

是的,在 .NET 或 J2EE 平台,我们可以构建非常好的 N 层 Web 应用程序。但是对于网站,我们还有其他简单的方法来管理远程数据库,例如,使用 XMLHTTP 和 ADO/ADOX。

RDBA 是如何工作的

RDBA 的工作流程如下:
  1. 客户端请求服务器执行查询。
  2. 服务器接收请求并执行,然后将结果返回给客户端。
  3. 客户端接收服务器返回的结果并显示它们。

RDBA 的两个重要方面是:

  1. 客户端和服务器之间用于发送命令和接收结果的通道。这就是 XMLHTTP。
  2. 服务器前端和数据库之间用于检索数据的中间层。这就是 ADO/ADOX。

RDBA 的工作流程如图 1 所示

RDBA working flow - xmlhttp_adox.gif

使用 XMLHTTP

顾名思义,XMLHTTP 控件可以通过 HTTP 请求发送和接收 XML 信息。

事实上,XMLHTTP 不止于此。它可以发送 XML、字符串、流或无符号数组格式的命令到服务器。命令也可以是 URL 的参数。它可以以 XML、字符串、流或无符号数组格式将结果发送到客户端。

在客户端使用 XMLHTTP 非常简单,只需 5 个步骤:

  1. 创建 XMLHTTP 对象。
  2. 使用指定的请求方法、URL 和服务器地址打开 XMLHTTP 连接。与 HTTP 相同,open 方法可以是 "POST" 或 "GET"。
  3. 将请求信息发送到服务器。
  4. 等待直到从服务器接收到结果。
  5. 释放 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) 对象的 IDispatchIStream

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) 对象的 IDispatchIStream。最常用的数据类型是 XML DOM 和 STRING。

您选择使用哪种数据类型取决于您的应用程序目标。

对于从远程服务器检索数据,最好在服务器和客户端都使用 XML 数据,以便处理大量数据并请求服务器添加/删除/修改/查询记录,以及在客户端进行排序/过滤。本文不重点介绍 XML COM。

本文中的示例是为使用虚拟主机的网站管理员准备的。因此,它需要两种基本能力:

  1. 管理远程数据库:添加/删除/修改/查询远程数据库/表/字段。
  2. 管理远程数据库中的数据:添加/删除/修改/查询记录。

因此,本示例侧重于通过 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 所示。

GOIS RDBA - goisrdba_en.gif

系统要求

要运行此示例,您的 PC 上应安装以下软件:Windows 98/Me/XP/2000 MSXML 4.0 MS Access 2000,IE 5.5 或更高版本。

安装和执行

  1. 下载示例 ZIP 文件 - supervisor.zip
  2. 将文件解压到您的 IIS 中的某个路径下,例如:C:\Inetpub\wwwroot\supervisor
  3. 在 IE 的 URL 地址栏输入 "localhost/supervisor/supervisor.asp",然后 GO。
  4. 通过稍作修改,例如更改路径,授权用户,您可以将此示例源代码上传到您的虚拟主机来管理您自己的数据库。

下载的 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/

编程愉快!

参考

© . All rights reserved.