ODAC使用指南 (一)ODAC常见问题集 (完)

类别:编程语言 点击:0 评论:0 推荐:
  我使用TSmartQuery不能成功获取可编辑的查询结果,但当使用TOraQuery时却可以。请问为什么会这样?

你必须明白,为了使任何数据集组件可以被编辑,就必须保证数据表中的记录允许被更新,并且能被独立识别。对TSmartQuery来说,它必须要在属性KeyFields中指出字段名,以标识记录(例如,字段,主键或唯一索引).

有一种可供选择的办法是 - 如果查询字段之一是更新表的RowId, TSmartQuery 就会找到它并在属性KeyFields为空时使用RowId来标识它。

属性 UpdatingTable 服务显示表将被更新(如果在查询中有许多表)。如果它的值为空,正在使用的表就会显示SQL操作的结果。 为了更好地对查询结果进行操作,建议应总是设置属性UpdatingTable。 

在不连接数据库时,我使用TDBGrid该怎样显示数据,程序窗体?

你可以使用 TVirtualTable 组件. 如果数据结构是已知的,就可在设计时使用字段编辑器来创建字段。 如果数据结构由应用程序执行时决定 ,则必须使用 AddField 方法. 应用程序能像对普通表那样使用数据填充 TVirtualTable .

你可以看这个位置的例子:

... \ODAC\Demos\VirtualTable\Vtable.dpr

从 1.80 版开始,当执行SQL操作时,如果没有改变数据库记录或改变了多个记录, ODAC-TOraQuery 开始显示错误 ("更新失败"), 在ODAC以前的版本中却从来都没有这样的错误提示。我自动去除这个错误?

在ODAC的1.80版本以后添加了这种特性是为了简化项目中从BDE升级到ODAC的事务处理。 BDE 的 TUpdateSQL 支持这种方法。为了不出现这个错误提示,必须将属性StrictUpdate的值设置为False.  非常抱歉,这是一个 public 属性,也就是说它的值可在运行时被修改。 

使用ODAC创建了应用程序,用户可在DBGrid中直接编辑记录。我怎样才能禁止用户的删除记录操作?

如果像TDataSet 那样使用 TOraQuery ,就可以非常简单地禁止记录的删除、插入以及更新操作。简单地清除相关属性(SQLDelete, SQLInsert,SQLUpdate). 这种方法并不适用于SQL操作或PL-SQL块。如果删除操作被禁止,原因可能是在DBGrid中执行了dgConfirmDelete选项,因为这个组件不能被 "guess", 所以导致删除操作被禁止。

用户必须要在DBGrid中可删除、插入以及编辑记录,但删除操作并不在DB中被实现。如果在TOraQuery中不填充 SQLDelete , 在 DBGrid 中就不允许删除操作。是否有方法可以越过这种限制?

方法非常简单,在 SQLDelete 中输入以下内容:

begin Null; end;

使用同样的方法,可以允许记录的更新以及插入,用这种方法并不能更新实际的数据表。如果不需要在数据表中实现任何的更新操作,可以使用 LocalUpdates。

数据表的主键用sequence(序列)填充. 在客户应用程序中能否禁止这个键的意义,而不需要执行任何额外的查询?

如果你使用 Oracle7, 获取新键值唯一的方法是显式查询。将这个字段用数据库的触发器来替换可以完全解决这个问题。为了简化网络传输及输出时间,可以使用下面的SQLInsert的PL-SQL块来代替SQL操作:  

begin Select <sequence_name>.NextVal into :Id from Dual; Insert into <table_name> values (:Id, ?; end; 如果你使用 Oracle8, 你可以使用数据库触发器来替换掉原有的字段。我们用触发器更新字段值这种方法来完成更新SQL操作:  Insert into <table_name> values (Null, ? returning Id into :Id通过这种方法,在Oracle8中可用其明显的牲性来使用SQL操作设置它的值:  Insert into <table_name> values (<sequence_name>.NextVal, ? returning Id into :Id上面的所有方法、例子都是假定的,表的 <table_name> 有一个被称为主键的标识字段而且这个字段在放在表中的第一个位置。 

不要忘了将属性 ReturnParams 设置为 True. 否则客户应用程序 "将不能查看" 新值.

如果你使用 TSmartQuery 操作、编辑有触发器的表,填充或校正字段值。你可按下面的步骤操作: 

  不要在属性KeyFields中指出能过触发器来更新的字段。 总是指示为 RefreshMode. 如果字段能用触发器进行更新, RefreshMode 应该是 rmAfterUpdate 或 rmAlways, 如果是插入则是 rmAfterUpdate 或 rmAlways, 如果是插入和更新,则仅需要 - rmAlways对ODAC 1.80 版的 TSmartQuery 来说,转换添加机制是最常见的情形。

使用户用存储过程来进行数据更新。 除了输入参数以外,还是输出参数,例如,"State".我怎样处理输出参数? 

请看下面的例子: 例如,属性SQL的内容如下:

Select * from <table_name>write Select 0 as State, T.* from <table_name>

很自然,这些字段对应用程序用户而言是不可见的。

我们写了一过程调用属性 SQLInsert, SQLUpdate and SQLDelete, 例如:

begin <insert_procedure> (State -> :State, ?; end; 我们设置属性 ReturnParams 为 True

 

在使用 BDE DAC 时,我们在DataSet中设置了属性 CachedUpdates 以使用户可以随意更改数据。如果既不调用ApplyUpdates方法也不调用CancelUpdates方法,这些更改并不在数据表中立即实现。ODAC属性 LocalUpdates 已经被添加,设计实现了同样的功能。我们能用ODAC使用同样的机制吗?

你可以使用原来的机制。

我们的项目使用了 MIDAS-技术. 我们将ORACLE作为一个高级服务器使,中间层用BDE存取ORACLE,通过DCOM执行客户端与服务端的连接,而没有使用 BDE . 我们想在中间层中想使用BDE,但是却没有什么好办法。ODAC不支持 IProvider 接口,但客户端必须要通过这个接口来得到结果。 能否解决这个问题?

为了解决这个问题,可以使用 TOraProvider 组件.并不需要重写客户应用程序。我们将服务端的 BDE DAC 改为 ODAC.然后添加 TOraProvider 组件. 我们应该设置ODAC数据集的属性DataSet的值. 同时用TOraProvider组件来替换 IProvider组件。

 

 

本文地址:http://com.8s8s.com/it/it29447.htm