delphi 中access数据库实现多库连接查询

这里是指多个access数据库例如以日期建的库包括同属性的表,现在需要对所有的表中的内容进行查询。

具体方法:第一步:建立一个空的数据库,并建立一个临时表temp_b

                  第二步:遍历需要查询的数据库,将其中的待查数据表与临时表temp_b建立连接,并查询内容追加到临时表temp_b

                  最后:只需要查询当前临时表temp_b。

这样做的好处就是,查询只用到一个数据ADOQuery,所有的记录集都保存其中。关联DBchar 和 DBGrid都比较处理。我正在做的一个项目中有根据查询结果排序功能,这种方式直接使用ADOQuery的Sor属性。数据要绘制曲线 直接关联DBchar即可轻松完成。

部分源码如下:

// 打开含有链接表的数据库
           l_cat := CreateOleObject('ADOX.Catalog');
           l_cat.ActiveConnection :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + MyPath + 'empty.mdb';
           TblCount := l_cat.Tables.Count;
           for i := TblCount - 1 downto 0 do
           begin  //删除原有连接
              l_tbl := l_cat.Tables[i];
              if l_tbl. Type = 'LINK' Then
                l_cat.Tables.Delete(i);
           end;

           F:=FindTempB(); //查询是否存在临时表temp_b
           if F=0 then CreatTemp_b()
           else if F>0 then ClearTemp_b();

           i := 0;
           while formatdatetime('yyyy-mm-dd',DayTemp) <= formatdatetime('yyyy-mm-dd', DateTimePicker3.Date) do
           begin
               i := i + 1;
               FileNames := 'S'+ formatDatetime('yyyy-mm-dd',DayTemp)+'.mdb';
               if ((FindFirst(MydataPath+FileNames, faAnyFile, Search) = 0)) then
               begin
                    // 创建新的链接信息
                    l_tbl := CreateOleObject('ADOX.Table');
                    l_tbl.Name := 'ALink' + inttostr(i); // 链接后的表的名称
                    l_tbl.ParentCatalog := l_cat;
                    l_tbl.Properties('Jet OLEDB:Remote Table Name') := combobox2.Text;
                    l_tbl.Properties('Jet OLEDB:Link Datasource'):= MydataPath + FileNames;
                    l_tbl.Properties('Jet OLEDB:Create Link') := true;
                    l_cat.Tables.Append(l_tbl);  // 添加连接表
                    l_tbl := unassigned;          // 追加记录
                    ADObatpara := TADOQuery.Create(nil);
                    ADObatpara.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+MyPath + 'empty.mdb'+';Persist Security Info=False';
                    ADObatpara.Active := false;
                    ADObatpara.SQL.Clear;
                    ADObatpara.SQL.TEXT:= 'INSERT INTO temp_b  SELECT * FROM ALink' + inttostr(i) + ';';
                    ADObatpara.ExecSQL;  // 查询当前数据库表 并将内容追加到 temp_b
                    ADObatpara.close;
                    ADObatpara.Free;

               end
               else finder :=false;
               DayTemp := IncDay(DayTemp,1);

           end;

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页