深入CursorAdapter(二)
来源:优易学  2011-12-9 18:17:38   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  用 CursorAdapter 来操作 XML 需要一些特殊的设置。下面是这些问题:
  ×× DataSource 属性被忽略;
  ×× CursorSchema 属性必须被填充好——即使你给 CursorFill 传递的第一个参数是 .F. 也一样——否则将会出错。
  ×× SelectCmd 必须被设置成一个表达式,例如一个用户自定义函数(UDF)或者对象方法名,该表达式能够为 Cursor 返回 XML。
  ×× 对 Cursor 的改动会被转换成一个 DiffGram,它是“包含着被改动了的字段或者记录,在被改动之前、被改动之后的值”的XML,当需要更新的时候,它被放在 DiffGram 属性中。
  ×× 为了把数据更动回写到数据源中去,UpdateCmdDataSourceType 属性必须被设置为“XML”,并且 UpdateCmd 必须被设置成一个能够处理提交更新任务的表达式(象前面一样,这个表达式也是象一个 UDF 或者对象的方法)。你可能会需要把 “This.DiffGram”传递给那个 UDF,这样它就可以把更新提交给后台数据源。
  这个 Cursor 所使用的 XML 源文件可能来自各种不同的地方。例如,你可以调用这样一个UDF:它能用 CursorToXML()来把一个VFP Cursor 转换成 XML,并返回结果:
  use CUSTOMERS
  cursortoxml('customers', 'lcXML', 1, 8, 0, '1')
  Return lcXML
  UDF 可以调用一个 Web Service,这个 Web Service 则返回一个 XML 结果集。这里是一个例子,我建立了一个 Web Service 并注册在我自己的系统上, 而智能感知则为我生成了下面的代码(具体的细节并不重要,它只是演示了一个 Web Service 的例子):
  loWS = newobject("WSclient', home() + 'ffc\_webservices.vcx')
  loWS.cWSName = 'dataserver web service'
  loWS = loWS.SetupClient(' http://localhost/' +
  'SQDataServer/dataserver.WSDL', 'dataserver',
  'dataserverSoapPort')
  lcXML = loWS.GetCustomers()
  Return lcXML
  它能够在一个 Web Server 上使用 SQLXML 3.0 去执行一个存储在一个临时文件中的 SQL Server 2000 查询(要了解关于 SQLXML 更多的信息,请访问 http://msdn.microsoft.com并查找 SQLXML)。下面的代码使用一个 MSXML2.XMLHTTP 对象通过 HTTP 从 Northwind 数据库的 Customers 表来取得所有的记录,稍后我们将做更进一步的解释。
  local loXML as MSXML2.XMLHTTP
  loXML = createobject('MSXML2.XMLHTTP')
  loXML.open('POST', ' http://localhost/northwind/' +
  'template/getallcustomers.xml, .F.)
  loXML.setRequestHeader('Content-type', 'text/xml')
  loXML.send()
  return loXML.responseText
  处理更新的事情要更复杂一点。数据源必须或者能够接受并处理一个 DiffGram (比如 SQL Server 2000 的情况),或者你必须自己去弄清楚所有的改动、执行一系列的 SQL 语句(UPDATE、INSERT 和 DELETE)去提交更新。
  这里是个使用了带 XML 数据源的 CursorAdapter 的例子(XMLExample.prg)。要注意的是:SelectCMD 和 UpdateCMD 都是要调用 UDF 的。在 SelectCMD 的情况中,要返回数据的客户编号被传递给一个叫做 GetNEWustomers 的 UDF,这个我们稍后再提。在 UpdateCmd 的情况中,VFP 把 DiffGram 属性传递给 SendNWXML,这个我们也稍后再提。
  local loCustomers as CursorAdapter,
  laErrors[1]
  loCustomers = createobject('CursorAdapter')
  with loCustomers
  .Alias = 'Customers'
  .CursorSchema = 'CUSTOMERID C(5), COMPANYNAME C(40), ' +
  'CONTACTNAME C(30), CONTACTTITLE C(30), ADDRESS C(60), ' +
  'CITY C(15), REGION C(15), POSTALCODE C(10), COUNTRY C(15), ' +
  'PHONE C(24), FAX C(24)'
  .DataSourceType = 'XML'
  .KeyFieldList = 'CUSTOMERID'
  .SelectCmd = 'GetNWCustomers([ALFKI])'
  .Tables = 'CUSTOMERS'
  .UpdatableFieldList = 'CUSTOMERID, COMPANYNAME, CONTACTNAME, ' +
  'CONTACTTITLE, ADDRESS, CITY, REGION, POSTALCODE, COUNTRY, PHONE, FAX'
  .UpdateCmdDataSourceType = 'XML'
  .UpdateCmd = 'SendNWXML(This.DiffGram)'
  .UpdateNameList = 'CUSTOMERID CUSTOMERS.CUSTOMERID, ' +
  'COMPANYNAME CUSTOMERS.COMPANYNAME, ' +
  'CONTACTNAME CUSTOMERS.CONTACTNAME, ' +
  'CONTACTTITLE CUSTOMERS.CONTACTTITLE, ' +
  'ADDRESS CUSTOMERS.ADDRESS, ' +
  'CITY CUSTOMERS.CITY, ' +
  'REGION CUSTOMERS.REGION, ' +
  'POSTALCODE CUSTOMERS.POSTALCODE, ' +
  'COUNTRY CUSTOMERS.COUNTRY, ' +
  'PHONE CUSTOMERS.PHONE, ' +
  'FAX CUSTOMERS.FAX'
  if .CursorFill(.T.)
  browse
  else
  aerror(laErrors)
  messagebox(laErrors[2])
  endif .CursorFill(.T.)
  endwith

  这里是 GetNWCustomers 的代码。它使用了一个 MSXML2.XMLHTTP 对象来访问一个位于一个Web Server 上的名叫 CustomersByID.xml 的 SQL Server 2000 XML 模板,并返回结果。要获取数据的 Customer ID 被作为一个参数传递给这段代码:
  lparameters tcCustID
  local loXML as MSXML2.XMLHTTP
  loXML = createobject('MSXML2.XMLHTTP')
  loXML.open('POST', " http://localhost/northwind/template/customersbyid.xml?";;; +
  "customerid=" + tcCustID, .F.)
  loXML.setRequestHeader('Content-type', 'text/xml')
  loXML.send()
  return loXML.responseText

  这段代码里引用的名为 CustomersByID.XML 的 XML 模板的内容如下:
  SELECT *
  FROM Customers
  WHERE CustomerID = @customerid
  FOR XML AUTO

  把这个文件放在用于 Northwind 数据库的一个虚拟目录中(参见补充文档《设置 SQL Server 2000 XML 访问》以了解更多关于为 SQL Server 2000 设置 IIS 的内容、以及这篇文章所需要的特殊细节。)
  SendNWXML 的内容看起来与 GetNWCustomers 类似,除了它接收的参数是一个 DiffGram,然后它把这个 DiffGram 加载到一个 MSXML2.DOMDocumnet 对象中,并把这个对象传递给 Web Server,该 Web Server 会通过 SQLXML 把这个对象传递给 SQL Server 2000 去处理。
  lparameters tcDiffGram
  local loDOM as MSXML2.DOMdocument.
  loXML as MSXML2.XMLHTTP
  loDOM = createobject('MSXML2.DOMdocument.#39;)
  loDOM.async = .F.
  loDOM.loadXML(tcDiffGram)
  loXML = createobject('MSXML2.XMLHTTP')
  loXML.open('POST', ' http://localhost/northwind/', .F.)
  loXML.setRequestHeader('Content-type', 'text/xml')
  loXML.send(loDOM)
  运行 XMLExample.prg 来看看它是怎么工作的。你将会在 Browse 窗口中看到一台记录(客户 ALFKI)。试着改动几个字段的值,然后关闭这个窗口,再运行 PRG 一遍。你会看到你的改动已经被写入到后台数据源中了。
  总结
  ××
  尽管 CursorAdapter 基类提供了一种对远程数据源的统一的结构,而不管你使用的是 ODBC、ADO还是XML——但是,根据你选择的数据访问机制的不同,对 CursorAdapter 的设置也有一些区别。这些区别取决于数据访问机制的本身。
  下个月,我将通过建立一些可重用的数据类、并讨论怎样在报表中使用 CursorAdapter 来结束这个系列的专题。
  补充文档:
  《设置 SQL Server 2000 XML 访问》
  为了能够在一个浏览器或者其它 HTTP 客户端用一个 URL 来访问 SQL Server 2000,你需要做一些工作。首先,你需要从 MSDN 网站( http://msdn.microsoft.com——查询一下“SQLXML”,然后选择下载)去下载和安装 SQLXML 3.0。
  接着,你需要设置一个 IIS 虚拟目录。步骤如下:从开始菜单|程序|SQLXML 3.0文件夹中单击“Configure IIS Support(设置 IIS 支持)”。展开你的服务器节点,选择要使用的 Web 站点,然后单击鼠标右键,选择“新建|虚拟目录”,在出现的对话框的“常规”页中输入虚拟目录的名称和它的物理路径。在这里,我们使用“Northwind”作为虚拟目录名、“NorthwindTemplates”作为物理路径。使用 Windows 资源管理器在你的系统上的什么地方建立这个物理目录,然后给它建一个名为 “Template”的子目录(稍后我们将会用到这个子目录)。把附件中的两个模板文件 GetAllCustomers.xml 和 CustomersByID.xml 拷贝到这个子目录中。
  在“安全”页中,输入访问 SQL Server 的相应的信息,例如用户名和密码或者你想采用的特定的验证机制。在“数据源”页上,选择 SQL Server,如果需要的话,还要选择要使用的数据库。在这里我们选择 Northwind 数据库。在“设置”页上选择希望的设置,至少要选上“允许模板查询”和“允许 Post”。
  在“虚拟名称”页中,从类型组合框中选择“模板”,并输入一个虚拟名称(在这里我们使用“template”)和物理路径(它应该是虚拟目录的一个子目录,在这里就是 "Template"子目录),这是使用模板的需要。好,单击“确定”。
  现在我们测试一下是否每样东西都设置正确了,我们将通过使用你拷贝到 Template 子目录中去得 GetAllCustomers.xml来访问 SQL Server。它的内容如下:
  SELECT *
  FROM Customers
  FOR XML AUTO
  为了测试的目的,打开你的浏览器,并输入这个URL: http://localhost/northwind/template/getallcustomers.xml,你就会在浏览器中看到XML形式的 Northwind Customers 表的内容了。

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训