摘要: --得到数据库的所有者名称SELECT distinct RDB$OWNER_NAME AS DATABASE_OWNERFROM RDB$RELATIONSWHERE (RDB$SYSTEM_FLAG = 1);--根据表名得到表的主键SELECT RC.RDB$CONSTRAINT_NAME AS CONSTRAINT_NAME, I.RDB$RELATION_NAME AS TABLE_NAME, S.RDB$FIELD_NAME AS COLUMN_NAMEFROM RDB$RELATION_CONSTRAINTS RC LEFT JOIN RDB$INDICES I ON (I.RD 阅读全文
posted @ 2011-05-31 21:03 fyen 阅读(3000) 评论(0) 推荐(0) 编辑
摘要: procedure TFormCustomerPage.cxTreeView1Expanded(Sender: TObject; Node: TTreeNode);var ANode: TTreeNode;begin inherited; ANode := Node.Parent; if ANode = nil then ANode := TTreeView(Sender).Items[0]; if ANode <> nil then begin TTreeView(Sender).Items.BeginUpdate; try if ANode = Node.Parent then 阅读全文
posted @ 2011-05-18 22:17 fyen 阅读(2024) 评论(0) 推荐(0) 编辑
摘要: 一般的,InterBase的存储过程分为两大类,它是根据客户端在调用存储过程时使用的不同方法划分的。一类是选择式存储过程,它返回一个数据集,客户端使用select语句调用存储过程,此时存储过程的作用好像和表、视图一样,选择式存储过程必须通过输出参数返回一个或多个数据行。另一类是执行式存储过程,它不返回数据集,客户端使用execute procedure来调用存储过程,这类存储过程大多数只执行一些动作而不返回数据行,当然它也可以返回输出参数信息。大家一定要注意,InterBase不存在这样的存储过程,它既返回数据集,同时又返回输出参数,你只能选择其一,不可能两者兼得,否则就会出错。1、创建存储. 阅读全文
posted @ 2011-05-10 23:46 fyen 阅读(5230) 评论(0) 推荐(1) 编辑
摘要: ------------带参数存储过程CREATE PROCEDURE SP_PRODUTNAME( PRODUCT_ID CHAR(12) )RETURNS ( PRODUCT_NAME CHAR(20))ASbeginfor select product_name from products where product_id =:product_id into :product_name dosuspend;end execute procedure sp_produtname('001') ----------------返回多行的存储过程,不带参数 alter PROC 阅读全文
posted @ 2011-05-10 23:44 fyen 阅读(790) 评论(0) 推荐(0) 编辑
摘要: 们知道,Borland一直强调Interbase的一个优点,它就是MGA机制。MGA机制当然也在Firebird上被采用。 那么,什么是MGA机制呢? MGA,全称Multi-Generational Architecture,中文名称多代版本机制,是一种并发处理机制。 在运行基于分布式系统时,常会发生几个客户端同时访问同一数据的情况,称为并发,并发如果处置不当,就会产生数据不一致。早期的数据库,全靠客户程序来处理并发,要手动加锁,手动解锁,现在的这些工作,DBMS已经自动处理了。并发处理,要采用加锁的方法才能避免冲突,加锁分两种,一种是悲观锁,还有一种是乐观锁。所谓悲观锁,是指当被加锁时,其 阅读全文
posted @ 2011-05-07 09:35 fyen 阅读(813) 评论(0) 推荐(0) 编辑
摘要: 近来,接到很多人询问InterBase的事务处理问题。我在以前文章的基础上重新加以整理,写了这个说明InterBase事物处理的短文,希望对大家有所帮助。此外,我希望唐版主能把这个短文做成一个单独文件连接,便于大家查阅,谢谢。InterBase的事务管理我们知道,与其它关系数据库系统不同,InterBase采用独特的多代结构和版本事务来提高其性能,因此,对InterBase来说,事务就显得尤其重要。为保证其版本事务的工作,InterBase要求任何一个对数据库的访问都必须包含在一个事务中进行,也就是说,无论对数据库进行读select、插入insert、更改update还是删除delete都要先 阅读全文
posted @ 2011-05-07 09:33 fyen 阅读(1334) 评论(0) 推荐(0) 编辑
摘要: IBExpert 如何改善Firebird/Interbase数据库 的解决方案1.如何找到没使用索引的procedures, trigger和views2.如何找到procedures和triggers中典型的类型转换问题3.如何了解你的数据库服务器的垃圾回收功能是否工作4.如何改变一个数据库中所有表的字符集5.如何比较不同数据库元信息的异同并得到一个差异脚本6.如何对存储过程及触发器进行版本管理7.如何比较当前数据库与另一个数据库的对象8.如何自动创建insert、update、delete或其它操作的sql语句9.如何找到所有对当前对象有依赖关系的对象10.如何比较不同硬件环境和数据库服 阅读全文
posted @ 2011-05-04 23:51 fyen 阅读(3609) 评论(0) 推荐(0) 编辑
摘要: Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好维护.我们都知道TClientDataSet的Delta属性记录了数据的所有修改,应用它我们就可以方便的实现一个单表更新的通用方法. 首先,在中间层添加一个方法,就叫ApplyUpdates吧.方法定义如下: function ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;参数UpdateTa 阅读全文
posted @ 2011-04-21 10:11 fyen 阅读(3591) 评论(1) 推荐(0) 编辑
摘要: /*建立虚拟测试环境,包含:表[卷烟库存表],表[卷烟销售表]。请大家注意跟踪这两个表的数据,体会触发器到底执行了什么业务逻辑,对数据有什么影响。为了能更清晰的表述触发器的作用,表结构存在数据冗余,且不符合第三范式,这里特此说明。*/USE MasterGOIF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’U’ AND NAME = ’卷烟库存表’)DROP TABLE 卷烟库存表GOIF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’U’ AND NAME = ’卷烟销售表’)D 阅读全文
posted @ 2011-04-21 10:09 fyen 阅读(4937) 评论(0) 推荐(1) 编辑
摘要: unit uAppCenter;{$WARN SYMBOL_PLATFORM OFF}interfaceusesWindows, ComObj, ComServ, ActiveX, HISAPP_TLB, Classes, SyncObjs, StdVcl,VCLCom, SysUtils, Forms, uDataType;typeTAppCenter = class(TComponent, IRDMSystem)private function LockRDM: IRDMSystem; procedure UnlockRDM(Value: IRDMSystem);protected { 实 阅读全文
posted @ 2011-04-21 09:22 fyen 阅读(1780) 评论(2) 推荐(1) 编辑