哈哈!又是InterBase!
1.用FIB啦!多年使用,屡试不爽!FIB可支持多种协议:Local,TCP/IP,NetBeui,
为了省事我做了一个DLL,只需调用一下即可,可返回大部分错误.要吗?
2.还是FIB,FIB在执行完一个Query后返回一个数据块结构,你查一个记录数和
每个记录结构的大小,一乘就得啦!别信他们的,SQL Monitor只能监测用户
的查询类别,查流量,没戏!
3.Interbase的存贮过程语法有些简陋,复杂的过程编不了.但Interbase最大
的好处是可以支持UDF!你编一个DLL(当然格式必须按规定的来),交给
InterBase,然后你可以在存贮过程中用它,也可以在DSQL中用它!
Seasky的方法肯定不灵,因为Interbase不支持Sqrt求平方根,除非从存贮
过程拿到中间结果然后后面部分拿到Delphi中处理.不过,我最反对这种
数据库里做一半,应用程序中做一半的搞法.
我可以将Seasky的方法写成过程你试试:
CREATE PROCEDURE S RETURNS (MYSQRTTOTAL FLOAT,MYCOUNT INTEGER) AS
DECLARE VARIABLE MYAVG FLOAT;
BEGIN
SELECT AVG(MYFIELD),COUNT(*) FROM MYTABLE INTO MYAVG,MYCOUNT;
SELECT SUM((MYFIELD-MYAVG)*(MYFIELD-MYAVG)) FROM MYTABLE INTO MYSQRTTOTAL;
END;
然后在Delphi中执行一个Query:
EXECUTE PROCEDURE S RETURNING_VALUES F1,F2
返回两个结果:方差和记录数,Result :=
Sqrt(Fields[0].AsFloat / Fields[1].AsInteger);
与其如些还不如用一个没有存贮过程的方法简单:
procedure GetAvgSqrt;
var
MyCount: Integer;
MySqrtTotal, MyTotal: Extended;
begin
MyQuery.SQL.Text := 'SELECT MYFIELD FROM MYTABLE';
ExecuteQuery;
MySqrtTotal := 0;
MyTotal := 0;
MyCount := 0;
while not MyQuery.EOF do begin
MyTotal := MyTotal + Fields[0].AsFloat;
MySqrtTotal := MySqrtTotal + Fields[0].AsFloat * Fields[0].AsFloat;
Inc(MyCount);
Next;
end;
Result := Sqrt(MySqrtTotal - MyTotal * MyTotal / MyCount) /
MyCount / (MyCount - 1);
end;