📄 jb4-1-8-5.htm
字号:
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft FrontPage 4.0">
<TITLE></TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<body bgcolor="#fefef2" style="FONT-SIZE: 9pt">
<P><STRONG><FONT
color=#0080FF size=3 >定制默认的解析器逻辑
</FONT>
</STRONG>
<hr>
译者名字: stavid(JD019) <br>
邮件地址:<a href="mailto:stavid@163.com">stavid@163.com</a>
<p><font size="2"> 当你从SAP、BAAN、IMS、OS/390、CICS、VSAM、DB2等定制数据源中访问数据时,JBuilder可以很容易地为你的数据编写出一个定制的解析器。</font></p>
<p><font size="2"> 类似Oracale或Sybase服务器,数据源的获取和更新,被分离为两个关键的接口:Providesr从数据源中填充数据集。Resolver将修改回存到数据源。通过将数据的获取和更新明确地分离为两个接口,就可以很容易地为新的数据源创建新的提供者/解析器组件。JBuilder当前针对标准的JDBC驱动程序提供了实现,这些驱动程序提供对常用数据库的访问,如支持Oracle、Sybase、Informix、interbase,DB2、 MS SQL Server、Paradox、dBASE、FoxPro、Access及其他常用数据库。这些包括:</font></p>
<p><font size="2"> .OracleProdedureProvider</font></p>
<p><font size="2"> .ProdedureProvider </font></p>
<p><font size="2"> .ProdedureResolver </font></p>
<p><font size="2"> .QueryProvider </font></p>
<p><font size="2"> .QueryResolver <br>
<br>
在你的JBuilder安装目录下的samples\DataExpress\CustomProviderResolver中有一个与定制提供者和解析器有关的示例工程(仅限于企业版)。示例文件TestApp.java是一个包含 JdbTable和JdbNavToolbar架应用程序。这两种可视化部件都被连接到 TableDataSet组件中,在这一组件中数据由一个定制的provider(在文件ProviderB ean.java中定义)提供,并存储到一个定制的resolver(在文件ResolverBean.java中定义)中去。该示例工程从一个简单的、大小不受限制的文本文件data.txt中读取和存储修改。接口文件DataLayout.java描述了文件Data.txt的结构。</font></p>
<p><font size="2"> 在教程:使用ProcedureResolver保存修改”有一个关于编写定制 ProcedureResolver的实例。<br>
<br>
<font color="#000080"><b>
理解默认的解析</b></font></font></p>
<p><font size="2"> 在将修改解析回数据源时,如果你没有明确地实例化一个QueryResolver组件,那么内置的解析器逻辑就会为你生成一个默认的QueryResolver组件。本主题揭示了利用QueryResolver来定制解析过程。</font></p>
<p><font size="2"> QueryResolver是DataExpress程序包的组件,它实现SQLResolver接口。在解析修改到数据库过程中,Resolu
tionManager所利用的就是这一SQLResolver接口。正如它的名称所暗示的那样,ResolutionManager类用来管理解析阶段。<br>
每一个StorageDataSet都有一个resolver属性。在调用Database.saveChanges() 方法时,如果这一属性没有被设置,那么就会产生一个默认的QueryResolver,并且尝试为一个特殊的DataSet存储修改。 <br>
<br>
<b><font color="#000080">
Adding a QueryResolver component</font></b><br>
<br>
添加QueryResolver组件利用JBuilder提供的可视化设计工具可以在应用程序中添加一个QueryResolver组件,步骤如下:<br>
<br>
1) 打开你想添加定制解析器逻辑的已存在的工程。这一工程应包含一个DataBase 对象和一个QueryDataSet对象。“查询数据库”是如何做的。 </font></p>
<p><font size="2"> 2) 选择Frame类,并点击Design选项卡,以显示UI Designer。 </font></p>
<p><font size="2"> 3) 在Component面板上的Data Express选项卡中,点击QueryResolver组件(如图所示 see help)。 </font></p>
<p><font size="2"> 4) 在组件树或UI Designer中点击(任何位置)将它添加到应用程序中。 UI Designer创建一个默认的Query Resolver对象(隐含名为QueryResolver1)</font></p>
<p><font size="2"> 5)要将QueryResolver连接到相应的DataSet:<br>
這樣做:将StorageDataSet的resolverde 属性设置为相应的QueryResolver,例如设为 QueryResolver1。<br>
如果不同的DataSet对象共享同一个事件处理的话,你可以将同一个QueryResolver 连接到多个DataSet上。如果每个DataSet对象需要定制事件处理,可以为每个DataSet 创建一个独立的QueryResolver。<br>
<br>
<br>
<font color="#000080"><b>
Intercepting resolver events</b></font><br>
<br>
<br>
拦截解析器事件你可以通过拦截QueryResolver事件来控制解析过程。当在content pane中选择了 QueryResolver对象时, Inspector的Event选项卡就会显示出它的事件。你所能控制的事件(在ResolverListener接口中定义)可以分为三种类型: </font></p>
<p><font size="2"> 被执行的工作通知。任何错误都会被视为是普通的异常,而不是错误事件。 </font></p>
<p><font size="2"> . deletingRow()</font></p>
<p><font size="2"> . insertingRow() </font></p>
<p><font size="2"> . updatingRow () .</font></p>
<p><font size="2"><br>
已经执行的动作通知:</font></p>
<p><font size="2"> . deletedRow() </font></p>
<p><font size="2"> . insertedRow() </font></p>
<p><font size="2"> . updatedRow() </font></p>
<p><font size="2"> 已经出现的条件错误。这些是内部错误,而不是服务器错误。 <br>
<br>
. deleteError()</font></p>
<p><font size="2"> . insertError()</font></p>
<p><font size="2"> . updateError()<br>
<br>
当解析管理器将要执行删除、插入或修改动作时, 就会产生第一组事件(deletingRow,insertingRow,updatingRow)相应的事件通知。其中一个伴随着到这些事件通知的传递参数是ResolverResponse对象。事件处理器(也被作为事件listener引用)的任务就是确定动作是否合适并将返回下列(ResolverResponse)响应中的一种: </font></p>
<p><font size="2"> . resolve() 指示解析管理器继续解析该行。</font></p>
<p><font size="2"> . skip() 指示解析管理器跳过该行并继续解析其余的部分。 </font></p>
<p><font size="2"> . about() 指示解析管理器停止解析。</font></p>
<p><font size="2"> 如果事件响应是resolve() (默认响应), 那么相应地就会产生第二组事件(deletedRow,insertedRow,updatedRow)中的某一个。在这些事件中没有响应发生。它们的作用仅仅是为了通知应用程序什么动作已被执行。<br>
<br>
如果事件响应是skip(),则当前行就不会被解析,并且将从数据的下一行开始继续进行解析。<br>
<br>
如果事件中断了解析过程,就会调用inserting方法,它会依次调用res ponse.about( )。由于错误事件与内部错误的响应相连,所以不会发生错误事件。但会抛出一个普通的ResolutionException来取消解析过程。<br>
<br>
如果在解析过程中出现错误,例如服务器禁止删除某行,那么就会产生相应的错误事件(deleteError,insertError或updateError)。这些事件传递下面这些参数:</font></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -