IBUpdateSql 使用问题(100分)

  • 主题发起人 主题发起人 zslg1
  • 开始时间 开始时间
Z

zslg1

Unregistered / Unconfirmed
GUEST, unregistred user!
请教:
用ibupdatesql1作为ibquery1的updateobject,在网格中能修改ibquery1返回的值,
但是并不能保存结果,在按钮中调用事件:onclick:ibquery1.database.applyupdates([ibquery1])
错误提示:update failed, 为何?
ibupdatesql1的SQL设置:用 generate SQL 有何问题?
多谢!!!
 
TIBUpdateSQL
【龙豪软件工作室 (3ASoft Studio) / 唐辉】
--------------------------------------------

TIBUpdateSQL 也是由 TIBCustomDataSet 派生出来的。
用 TIBUpdateSQL 来指定一组 SQL 语句,用于在缓存更新的情况下更新只读的 TIBQuery 控件数据。如对 TIBQuery 控件进行 INSERT、DELETE、UPDATE、REFRESH等操作。其中TIBUpdateSQL 所指定的 SQL 语句必需符合 SQL-92 标准。而 TIBQuery 控件是通过 UpdateObject 属性来指定 TIBUpdateSQL 对象的。

【属性】

【DataSet】
【申明】 __property TIBCustomDataSet* DataSet
在设计时,当一个数据集的 UpdateObject 属性指定为一个 TIBUpdateSQL 对象时,TIBUpdateSQL 控件的 DataSet 属性将自动地指定那个数据集控件。
如果是在运行期间动态地生成,必需手动设置其 DataSet 属性来指定所要更新的数据集控件。

【DeleteSQL】
【申明】 __property Classes::TStrings* DeleteSQL
此属用于设置一个 DELETE 的 SQL 语句,当应用程序在缓存更新情况下试图删除一条记录时,将自动执行此 DELTE 语句。在设计时,我们可以通过点击 DeleteSQL 右边的按钮,打开输入对话框,书写我们的 DELTE 语句,如:

delete from Employee
where
Emp_No = :OLD_Emp_No

注意:在上面的例子中,我们了"OLD_"标识符用于区别删除前与删除后的字段数据。
而在运行期间,我们必需通过程序来书写一段 DELETE 语句到 DeleteSQL 属性中。

【InsertSQL】
【申明】 __property Classes::TStrings* InsertSQL
此属用于设置一个 INSERT 的 SQL 语句,当应用程序在缓存更新情况下试图增加一条记录时,将自动执行此 INSERT 语句。在设计时,我们可以通过点击 InsertSQL 右边的按钮,打开输入对话框,书写我们的 INSERT 语句,如:

insert into Country
(Country,
Currency)
values (:Country,
:Currency)

而在运行期间,我们必需通过程序来书写一段 INSERT 语句到 InsertSQL 属性中。

【ModifySQL】
【申明】 __property Classes::TStrings* ModifySQL
此属用于设置一个 UPDATE 的 SQL 语句,当应用程序在缓存更新情况下试图更新一条记录时,将自动执行此 UPDATE 语句。在设计时,我们可以通过点击 ModifySQL 右边的按钮,打开输入对话框,书写我们的 UPDATE 语句,如:

update Employee
set Last_Name = :Last_Name
where Emp_No = :OLD_Emp_No

注意:在上面的例子中,我们了"OLD_"标识符用于区别更新前与更新后的字段数据。
而在运行期间,我们必需通过程序来书写一段 UPDATE 语句到 UpdateSQL 属性中。

【Query】
【申明】 __property Ibquery::TIBQuery* Query[Db::TUpdateKind UpdateKind]
此属性用于返回一个 TIBQuery 控件对象,并且其中的 SQL 属性指向 TIBUpdateSQL 控件所对应的 SQL 更新语句。其参数 UpdateKind 的取值如下:


取值 说明
ukModify 返回一个 TIBQuery 对象,
其 SQL 属性指向 TIBUpdateSQL 控件中的 ModifySQL 属性。
ukInsert 返回一个 TIBQuery 对象,
其 SQL 属性指向 TIBUpdateSQL 控件中的 InsertSQL 属性。
ukDelete 返回一个 TIBQuery 对象,
其 SQL 属性指向 TIBUpdateSQL 控件中的 DeleteSQL 属性。

【RefreshSQL】
【申明】 __property Classes::TStrings* RefreshSQL
此属用于设置一个 SELECT 的 SQL 语句,来刷新数据集记录。在设计时,我们可以通过点击 RefreshSQL 右边的按钮,打开输入对话框,书写我们的 SELECT 语句,如:

SELECT Country,
Currency
FROM Country
WHERE Country = :Country

而在运行期间,我们必需通过程序来书写一段 SELECT 语句到 RefreshSQL 属性中。

【SQL】
【申明】 __property Classes::TStrings!ALink(TStrings_Object,1)* SQL[Db::
TUpdateKind!ALink(TUpdateKind_Type,1) UpdateKind]
此属性在 ModifySQL、InsertSQL 或 DeleteSQL 属性中返回一个 SQL 语句,具体的设置依赖于参数 UpdateKind 的取值。
参数 UpdateKind 取值如下:


取值 说明
ukModify 返回一个 SQL 语句用于在数据集中更新一条记录。
ukInsert 返回一个 SQL 语句用于在数据集中插入一条记录。
ukDelete 返回一个 SQL 语句用于在数据集中删除一条记录。




【方法】

【Apply】
【申明】 virtual void __fastcall Apply(Db::TUpdateKind UpdateKind);
此方法用于设置一个参数,然后执行这个参数所指定的 SQL 语句。
参数 UpdateKind 取值如下:


取值 说明
ukModify 在 ModifySQL 属性中建立并执行其中的 SQL 语句
ukInsert 在 InsertSQL 属性中建立并执行其中的 SQL 语句
ukDelete 在 DeleteSQL 属性中建立并执行其中的 SQL 语句


【ExecSQL】
【申明】 void __fastcall ExecSQL(Db::TUpdateKind UpdateKind);
在缓存更新的情况下,此方法用于执行一条其参数所指定的 SQL 语句来在更新、删除或插入一条记录。
参数 UpdateKind 取值如下:


取值 说明
ukModify 执行一条 SQL 语句用于更新数据集的一条记录
ukInsert 执行一条 SQL 语句用于插入数据集的一条记录
ukDelete 执行一条 SQL 语句用于删除数据集的一条记录


【SetParams】
【申明】 void __fastcall SetParams(Db::TUpdateKind UpdateKind);
此方法将用 SQL 语句中字段值来代替同名的参数值。
和上面的方法一样,UpdateKind 取值有ukModify、ukInsert、ukDelete三种:


【TIBUpdateSQL】
【申明】 __fastcall virtual TIBUpdateSQL(Classes::TComponent* AOwner);
通过 new 字符来创建一个新的 TIBUpdateSQL 对象。

 
http://www.3asoft.com/skill/ibx/TIBUpdateSQL.htm
 
最重要的是KEY设置。
 
也就是说:IB表中必须设立 PrimaryKey 吗?我试了试好像是这样的。
可问题是:用IBExpert工具,在一个表上增加主键老是失败!在空表上似乎可以,
interbase问题还得向大家多多请教!
多谢!!!
 
请教:刷选缓存更新数据显示类型
procedure Tmainform.UpdateRecordsToShow(Sender: TObject);
var updatetypes: TupdaterecordTypes;
begin
updatetypes := [];
if mainform.unmodifiedCB.Checked then //checkbox
include(updatetypes, rtunmodified);
if mainform.modifiedCB.Checked then
include(updatetypes, rtmodified);
if mainform.insertedCB.Checked then
include(updatetypes, rtinserted);
if mainform.deletedCB.Checked then
include(updatetypes, rtdeleted);
data.query1.UpdateRecordTypes := updatetypes; //此行标定错误提示
end;
编译后错误提示:Tcachedupdatestatus和Enumeration类型不匹配,如何解决?
多谢!!!
 
谁能解答这个类型不匹配的问题?
 
多人接受答案了。
 
后退
顶部