数据表的本地化
本地化的目的是将某一个table或query当做一个数据表来进行处理,并且这个本地化的数据表可以用在sql语句中。
需要用到控件:TFDLOCALSQL。
例如,程序中有两个CONNECTION,分别是CON1和CON2,我们需要在CON1中使用到CON2的数据。
Qry1连接的是con1,ndbairports(也是一个tfdquery)连接的是con2,可以按以下的代码设计:
FDLocalSQL1.Connection :=con1; NDBAIRPORTS.LocalSQL:=FDLocalSQL1; FDLocalSQL1.Active := True; QRY1.Open('SELECT * FROM AIRPORT WHere ICAO IN (SELECT IDENT FROM NDBAIRPORTS)');
注意,要先确认FDLocalSQL1.Active := True;
在上例中,直接把NDBAIRPORTS当做一个表来使用。
当然,如果本身连接都是sqlite的连接,可以用attach来实现此功能,但本地化可以连接两个不同的连接,例如一个是sqlite数据库,一个是oracle数据库。
归根到底,本地化的原理就是:
- 设置一个本地化连接控件TFDLOCALSQL。
- 将其connection属性设置到需要使用本地化连接的连接TFDconnection。
- 将需要使用的表的LocalSQL属性设置到你设置的本地化连接控件。
- 注意一定要让本地化连接控件的active:=true,另外,如果本地化连接的表是FDMEMTABLE,则这个内存表一定要打开,空数据表是不允许本地化的。
完成了以上的设置,就可以把其它连接的查询当做一个表来使用了。
如果另一个查询来自非firedac连接怎么办?
其实TFDLOCALSQL的正确打开方式是:
With fdlocalsql1.datasets.add do Begin Dataset:=oaqry1;//使用ODAC连接的ORACLE查询 Name:=’notamapt’; End;
这个才是设置本地化连接的完整方式。在qry1中,就可以把notamapt当做一个表来使用了。
跨DBMS的本地化还可以采取使用TFDMETable来实现,具体就是把任何查询拷贝到TFDMEMTable中,然后把内存表当做一个表使用。