为什么跨平台SQL语句可以在 SQL Builder 中正常运行,但却不能在程序中或SQL Explorer中运行?(50分)

  • 主题发起人 主题发起人 Crab
  • 开始时间 开始时间
C

Crab

Unregistered / Unconfirmed
GUEST, unregistred user!
在 SQL Builder 中,做一个跨 Interbase 和 Oracle 7的查询,运行
正常,把其生成的 SQL 语句 copy 到 Query1.Sql 中,或者到
SQL Explorer中,却不能运行,为什么?当跨 paradox 表和 Interbase表
查询时,在Sql builder中总是没问题, 在sql explorer中查询,左边的数据库选择 paradox 时,可以查询,但选择 interbase 库时,就出错。
SQl builder究竟有什么奇特之处?例如下面的语句(用 Sql builder 生成):
SELECT Country.COUNTRY, Animals.NAME
FROM ":IBLOCAL:COUNTRY" Country, ":DBDEMOS:animals.dbf" Animals
 
两个库都开着吗?
用sqlBuilder只是生成sql.并不能保证能运行。
跨库的查询是很困难的。我想不能那么作。
 
两个库全都打开着。在sql Builder 中运行很正常,可以得出想要的记录,
但在程序中、sql explorer中、ISQL 中都不能运行,总提示出不识别 ":...:"
这样的Token,有人知道原因吗?
 
跨库查询是BDE的功能,因此只能用LocalSQL的模式,比如你的例子,
"左边的数据库选择 paradox 时,可以查询,但选择 interbase 库时,就出错"
这是因为“左边的数据库选择 paradox 时”,自然是LocalSQL的模式。

因此,你要在程序里使用,也必须把你的tquery的database或alias指定为
DBDEMOS等本地数据库,或者把你的其他alias的SQLQRYMODE指定为LOCAL。
建议使用前一种方式,这相当于一个trick,可以使你在不必改动其它数据库查询
模式的情况下使用跨库查询的功能。例如:

SELECT Country.COUNTRY, department.deptid
FROM ":IBLOCAL:COUNTRY" Country, ":sqlserver:department" department
这里根本没有涉及dbdemos的表,但可以在DBDEMOS alias的SQL中查询通过。
 
I met the same problem.sql explorer只认识焦点的库,
所以你只有把数据放入同一库中。写一Delphi程序转换。
Qb_money-->The one;Table1-->The other;
Next is my TurnDatabase code,Hope it help.

Qb_money.close;
Qb_money.SQL.Clear;
Qb_money.sql.Add('select * from b_money03 where 1=1');
Qb_money.sql.Add('and workno>1000');
Qb_money.sql.Add('and basemoney<>0');
Qb_money.Open;
Qb_money.First;
Tsb.close;
Tsb.Open;
while not Qb_money.EOF do
begin
with Table1 do
begin
Append;
FieldByName('empNo').value:=inttostr(Qb_money.FieldByName('workno').value);
FieldByName('dptNo').value:=Qb_money.FieldByName('bm_code').value;
FieldByName('basicSalary').value:=Qb_money.FieldByName('basemoney').value;
FieldByName('positionAlwc').value:=Qb_money.FieldByName('zhiwujt').value;
FieldByName('skillAlwc').value:=Qb_money.FieldByName('zhinengjt').value;
FieldByName('bonus').value:=Qb_money.FieldByName('b_bonus').value;
FieldByName('rentAlwc').value:=Qb_money.FieldByName('zonghebt').value;
// FieldByName('generalAlwc').value:=Qb_money.FieldByName('house').value;
FieldByName('foodAlwc').value:=Qb_money.FieldByName('huoshibt').value;
// FieldByName('welfareAlwc').value:=Qb_money.FieldByName('fulibt').value;
FieldByName('spcAlwc').value:=Qb_money.FieldByName('tebiejt').value;
FieldByName('dateStarted').value:=Qb_money.FieldByName('baodaodate').value;
FieldByName('accountBank').value:=Qb_money.FieldByName('bank_code').value;
FieldByName('eduNo').value:=inttostr(Qb_money.FieldByName('culture').value);
FieldByName('station').value:=Qb_money.FieldByName('gwlb').value;
Post;
end;
if PBhr.Position=10 then PBhr.Position:=0
else PBhr.Position:=PBhr.Position+1;
Qb_money.Next;
end;

 
温柔一刀说的方法是对的,这种方法可以骗过 BDE, 但对于跨库的 Insert 语句
出现了怪事,执行时出错,说一个 cursor handle 有误,但是执行结果却是对的,
我只好用一个空的 try..except 块把错误封闭起来
 
多人接受答案了。
 
>>"说一个 cursor handle 有误,但是执行结果却是对的"

(猜测)可别是你用了Open的缘故吧,insert只能用execSQL
 
后退
顶部