Interbase的自增字段和UDF,(没信心用Interbase了)(50分)

  • 主题发起人 主题发起人 江西的delphi
  • 开始时间 开始时间

江西的delphi

Unregistered / Unconfirmed
GUEST, unregistred user!
1.Interbase中有能产生自增的方法
如下:
create GENERATOR BBB;
Create table AAA
(
a integer not null primary key,
b varchar(20)
);
create trigger binsaaa for aaa
before insert
as
begin
new.a=gen_id(bbb,1);
end;
这只对insert的sql语句有效即insert into AAA(b) values ('Interbase')时,字段a自动增量;
但我用ibtable.append那怎么办?
2.UDF
我下了一个Ib_Math.dll,这个文件哪个地方我都放过bin,lib,system,system32,我用win2000server,delphi5.0.interbase5.5,
下面的sql在d5的sql explore和interbase中的sql中使用就是不通过。
DECLARE EXTERNAL FUNCTION SR_FRAC
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT "MathFrac" MODULE_NAME "Ib_Math.dll"
select Frac(employee.salary) from employee
 
1、自增字段就和PARADOX里的AUTOINC字段一样用嘛,APPEND后,该字段赋一初值或不赋
值就行了
2、IB_MATH.DLL就放在INTERBASE的安装路径的UDF目录下,我看你的定义是SR_FRAC,怎么
调用成了FRAC,如果你用IB6,可能要注意大小写
 
TO:zm30
1.这一字段(自增字段)是关键字,一开始就要赋值(在写其它字段之前),我的
要求是table.append-->这一字段(自增字段)由系统直接赋(自增)值.
2,我的interbase没有UDF目录,我的是5.5(d5光盘自带的).用SR_FRAC还是不行,出借如下
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 6, char -1
-select
 
如果你不是主从表的话,你给字段A赋一初值就行了比如0,
存盘时它会改过来,如果是主从表建议你不要用自增字段

至于UDF你可以这样试一下:
select SR_FRAC (1.1) from Employee
看看帮助自己多试试

我现在用IB6做了一个系统,挺好的,系统开销小,性能也不差
不要对它失去信心
 
同意楼上自增量的说法.

其实UDF非常不错的,可以自己写函数,爽.
 
TO:zm30
1.解决了,谢谢,可以骗过去(我用关键重复都不会错,
table.append;table.fieldbyname('a').asinteger:=1;其中a字段等于1的记录已有,
可能写进数据库时值又会改变了(触发器改的))
2.select SR_FRAC (1.1) from Employee,这个我倒是试过了,是不是
(DECLARE EXTERNAL FUNCTION SR_FRAC
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT "MathFrac" MODULE_NAME "Ib_Math.dll")
不能写在sql语句里吗?
搞定后,就加分!

 
Interbase资料少
 
你的trigger是 before insert,
不是指支持 datset.insert 而不支持dataset.Append
实际它是指insert的sql命令
对这种c/s的数据库,dataset.insert或者dataset.append都是使用insert的sql命令来实现的
所以一样用,不用担心dataset.append不触发trigger
 
DECLARE EXTERNAL FUNCTION SR_FRAC
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT "MathFrac" MODULE_NAME "Ib_Math.dll"
可以写在sql啊
 
TO Pipi:
1.谢谢大侠,原来ibtable的编辑(append,insert,post)都是通过sql的方式传向后台
的数据库的。是不是所有的方式(bde,ado),(c/s或其它)都通过sql命令的方式向
后台写数据的?还待大侠的分解。
2,回去再试。(有没有决巧?)
 
c/s的数据库,比如oracle,sqlserver.interbase 等等,都是通过sql命令的
桌面数据库,比如dbase,paradox则不是
 
再次谢谢pipi大侠!
 
2:UDF
DECLARE EXTERNAL FUNCTION SR_FRAC
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT "MathFrac" MODULE_NAME "Ib_Math.dll"
单独执行上面那4行没有出借信息,
但一起执行到下面这行就出错
select frac(12.4) from employee
这说明了什么呢?
出错为
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 6, char -1
-select
 
用力蹭一下!
 
命令要一条一条执行,不能一次执行2个sql命令
所以先执行创建function的
然后query.SQL.Clear
再添加select命令执行
如果是在isql控制台里面执行多条sql命令,那要分号隔开
不过在TQuery里面那是一次只能执行一条的,用分号隔开也没戏
 
to:Pipi
我是在isql中执行,只有
MODULE_NAME "Ib_Math.dll";
有分号。应该是按你所说的,不知有没有别的决巧?
它只报select那个地方出错。
 
分号是半角的吧
DECLARE EXTERNAL FUNCTION SR_FRAC
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT "MathFrac" MODULE_NAME "Ib_Math.dll";
select sr_frac(12.4) from employee;
两个都要半角分号结束,另外你的函数叫做sr_frac啊
 
首先再次感谢pipi大侠,按你的方法有了一点进展:
错误信息为:Statement failed, SQLCODE = -607
unsuccessful metadata update
-DEFINE FUNCTION failed
-attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_9"
 
再踢一去!
 
function总共只需要定义一次,定义以后就可以不停的用了,
关机重起也还是存在的,function定义已经保存在数据库了,不需要次次都定义
如果你改变了函数定义,那也要先删掉他才能再次定义
 
后退
顶部