云关係型资料库(RDS)是一种稳定可靠、可弹性伸缩的线上资料库服务,支持MySQL、SQL Server、PostgreSQL、PPAS(Postgre Plus Advanced Server,高度兼容Oracle资料库)、MariaDB等引擎,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案。
远程数据服务
RDS(Remote Data Services,远程数据服务)是允许我们处理客户端数据的一系列服务的统称。现在不用担心这方面的问题,因为RDS本身就是ADO的一部分,只有在需要传送和使用客户端数据时,才会使用。远程数据服务RDS允许程式设计师开发原生的WINDOWS分散式多层套用系统,或是开发以浏览器为图形用户接口的WEB套用系统。
下面是使用参数创建TDC的一个例子。也可以在客户端脚本中获取数据,下面的例子显示了给TDC载入数据的JScript脚本。function fillTDC(){ dsoAuthors.dataURL = 'authors.csv'; dsoAuthors.Reset();}如果改变了TDC的DataURL参数,必须使用Reset方法,这样才能使新的URL起作用。当介绍数据绑定时,会更详细地讨论如何使用它。Reset方法是TDC唯一的一个方法。 2. RDS数据控制项 RDS数据控制项能够访问一般的数据存储,而不是平面档案。它通常用于连线SQL资料库以从表、查询或存储过程获取数据。与TDC不同,RDS数据控制项允许更新数据。在本章稍后通过示例说明如何进行数据更新。类似于TDC,可以用HTML脚本中的OBJECT标记来创建一个RDS数据控制项,并以类似的方式设定其属性。authorsonclick="resetData('publishers')">publishers下面创建虚表。 这充当了模板的作用。注意,表格中还没有单元格。这是因为并不知道数据有多少个栏位,所以也将在运行期间创建它们。现在编写JScript代码。首先看一下resetData函式,该函式设定数据控制项的属性并载入数据。function resetData(sTable){ // reset the data dsoData.Connect = 'Provider=SQLOLEDB; Data Source=' + '' + '; Initial Catalog=pubs; User ID=sa; Password='; dsoData.Server = 'http://'; dsoData.SQL = 'SELECT * FROM ' + sTable; dsoData.Refresh();} 虽然这看起来比使用参数更複杂一些,但是仍然比较简单。别忘了参数名是如何映射到属性的?这里所做的就是设定那些属性,然后调用Refresh方法更新数据控制项。看上去,这可能比以前的例子更糟糕,因为在代码中只有不多的ASP,也只是简单地在属性中填入Web伺服器的名字。但使用该方法可以在不修改代码的情况下将此ASP页面从一个伺服器移到另一个伺服器。作为数据源的表名可以通过选择适当的按钮而传给函式。一旦载入了数据,将触发数据控制项的ondatasetcomplete事件,运行createCells函式。function createCells(){ var fldF; var tblCell; // delete what's there already deleteCells(); // now create the new cells for (fldF = new Enumerator(dsoData.recordset.Fields); !fldF.atEnd(); fldF.moveNext()) { // create a new cell for the heading tblCell = tblData.rows【0】.insertCell(); tblCell.innerHTML = '' + fldF.item().name + ''; // create a new cell for the body tblCell = tblData.rows【1】.insertCell(); tblCell.innerHTML = ' fldF.item().name + '">'; } // now bind to the data source tblData.dataSrc = '#dsoData';}这同样也很简单。首先删除了现有的表格单元格(马上会介绍这个函式),然后遍历记录集的栏位。在行头为每个栏位创建一个新单元格(这个表格只有两行:第一行,即第0行,是表头;第二行,即第1行,是表体)。表格单元创建完后,将innerHTML属性设为对应的栏位名。在表体中创建新单元格的过程类似,但此时使用innerHTML元件保存绑定到数据栏位的INPUT标记。当所有的栏位都完成这样的操作后,这个表就与数据控制项绑定了。因为这个页面允许在两个不同的数据集之间进行切换,所以需要先删除现有的数据。function deleteCells(){ var iCell; var iCells; // unbind the table tblData.dataSrc = ''; // delete existing cells iCells = tblData.rows【0】.cells.length for (iCell = 0; iCell < iCells; ++iCell) { tblData.rows【0】.deleteCell(); tblData.rows【1】.deleteCell(); }}这个子程式只是对表解除绑定,然后在表格中遍历所有的单元格并删除它们。等到上述程式执行完毕,表格就只剩下空的表头和表体行。这是一个用RDS和一些DHTML实现的简单例子。可以容易地把其加到一个ASP包含档案中,并把该档案放到任何应用程式中,即使数据源不改变也可使用这种方法。这个例子的全部代码——档案RDSDynamicBinding.asp以及类似的其他类型的数据控制项例子,可以在Wrox站点上找到。 10.2.6 更新数据迄今为止,仅学习了在客户端如何取到数据,但还没有涉及如何更新客户端数据,和将其送回伺服器。别忘了,记录集是下线的,那幺如何更新数据呢?对数据所做的任何修改只是数据控制项中本地记录的一部分,因此为了更新伺服器必须发一条特殊的指令。然而这并不需做什幺複杂的工作,因为RDS数据控制项有两个方法,允许我们要幺取消最近对数据所做的任何修改,要幺将所有修改送到伺服器。为了方便用户,可以为此创建一些按钮。 ONCLICK="dsoData.CnacelUpdate()">Cnacel ONCLICK="dsoData.SubmitChanges()">SaveSubmitChanges方法只将那些改动过的记录送回伺服器,而CancelUpdate方法则取消在本地记录集上所做的任何修改。更新和取消更新操作并不是唯一所需的。如果想增加新的记录或删除一条现有的记录,怎幺办?可以使用记录集的AddNew和Delete方法。这将增加或删除记录集中的记录,然后在传送SubmitChanges命令后,伺服器上的数据就可以被更新。 ONCLICK="dsoData.recordset.Delete()">Delete ONCLICK="dsoData.recordset.AddNew()">Add 1. 解决冲突的方法 由于与数据源下线,可能会碰到有关冲突的问题。例如在更新一条记录并将其保存到数据存储的时候,有人也修改了这条记录时,会发生什幺情况? SubmitChanges方法已经提供了相应的处理冲突的方法,如果发生冲突,那幺该方法将产生一个错误。 在调用SubmitChanges方法期间,只要其中一条记录更新失败,那幺所有的记录更新都会失败。这保证了原始数据不会被部分更新。可以遍历记录集,并检测记录的Status属性来告诉用户哪一条记录更新失败了。例如,最好调用自己的updateData函式,而不只是在命令按钮中调用SubmitChanges方法。 此时,我们知道已经发生了一个错误,但并不知道是哪一个错误,因此必须重新同步当前数据与数据存储中的数据。使用adResyncUnderlyingValues确保只有栏位的UnderlyingValues属性被数据存储中的值覆盖,也就是说所做的修改是安全的(记住,修改的内容保存在Value属性中)。可以在后面的代码中比较当前的值与资料库中的值。 Status可以是不同值的组合,详见附录。例子代码( RDSConflicts.asp )中有一个将这些值转换为描述性字元串的函式。 我们知道记录有某些形式的冲突,但无法确切地知道为什幺或哪一个栏位引起了冲突。因此需要遍历栏位检测它们的值。 这就是UnderlyingVaule属性发挥作用的地方。 栏位有三种值: Vaule代表新值,即经过修改的栏位值。 UnderlyingVaule代表数据存储中存储的栏位值。 OriginalVaule代表从数据存储读取后,但还没有修改之前的栏位值。 这意味着UnderlyingVaule会保存其他用户修改过的值,而OriginalValue是栏位原有的值。因此比较两者之值,如果不同,则说明栏位已经被另外的用户修改了。 可以利用所有这些错误信息来创建一个表格以显示是否确实发生错误。例子(RDSConflicts.asp)产生的输出结果如图1 0 - 11所示。 这里可以见到三种不同的值。原始值是Johnson。然后,在另一个视窗(如SQL Server Query Analyzer)中将值改为Johnson。在浏览器视窗,利用RDS将这个值改为Andy,并按下Save All Changes按钮。Resync命令将资料库中的值取出并写入UnderlyingVaule属性。我也对Lastname列做了相似的修改。 使用这种方法,可以看到每一个发生变化的栏位的值。由于SubmitChanges方法可以处理多个栏位,读者可能希望为这个表增加额外的列以显示ID栏位,这样就可以看到是哪一个栏位更新失败了。
无线广播
RDS是英国BBC广播公司开发的一种特殊的无线电广播,称“无线数据广播系统”(Radio Data System),它是在调频广播发射信号中利用副载波把电台名称、节目类型、节目内容及其它信息以数字形式传送出去。通过具有RDS功能的调谐器就可以识别这些数位讯号,变成字元显示在显示屏上。在收到节目的同时,通过RDS可知道接收到的是那个电台,它的发射频率,并给出该电台其余的频率,由此再使用“切换频率”钮来保证所接收的信号为最强的频率。RDS无线数据广播档案可显示接收到的节目名称及其它资料。RDS功能可按节目类型决定取捨,寻找到符合你要求的电台。RDS还能用来自动控制接收机,使流动工作的汽车收音机一直保持最佳接收状态,及时收到紧急交通报告,有利交通安全。 RDS除使收音机自动化、高档化外,并在城市交通管理中发挥作用,其使用领域尚在拓展中。