大家新年好,请教一个问题:如何对多个异构数据库(分布在不同主机上)进行多表关联查询? ( 积分: 300 )

  • 主题发起人 主题发起人 nylx
  • 开始时间 开始时间
查证了一下<br>在Access里面<br>新建&nbsp;-&gt;&nbsp;链接表<br>可以连到PDF
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2197390<br>另外看看这个<br>异构数据库的操作
 
把我压箱底的告诉你吧![:)]<br>以数据库是sqlserver2000和access2000数据库为例:<br>假如:sqlserver2000中数据库db中表tab1有两个字段:f1,f2<br>access2000数据库db1中表tab2有两个字段:f1,f3<br>以下为实现关联查询的方法:<br>1、ADOConnection指向sqlserver2000<br>2、执行sql语句:SELECT&nbsp;a.f1,&nbsp;a.f3,&nbsp;b.f2<br>FROM&nbsp;OPENDATASOURCE&nbsp;('Microsoft.Jet.OLEDB.4.0',&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Data&nbsp;Source=&quot;D:/db1.mdb&quot;;User&nbsp;ID=Admin;Password='&nbsp;)...tab2&nbsp;a&nbsp;INNER&nbsp;JOIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tab1&nbsp;b&nbsp;ON&nbsp;a.f1&nbsp;=&nbsp;b.f1
 
SQL&nbsp;帮助里面就有啦,你看看帮助就明白;<br>&nbsp;&nbsp;&nbsp;OPENDATASOURCE;<br>&nbsp;&nbsp;&nbsp;openRowSet;<br>&nbsp;&nbsp;&nbsp;openQuery;<br>各有不同,我习惯用&nbsp;OpenDataSource;
 
“挑战高手”,&nbsp;在这里用的不太恰当。答案已经有了,而且很简单。
 
建链接表:打开,ACCESS数据库,右键,链接表,后面就不用说了吧。
 
这佷简单啊:<br><br>SQL&nbsp;SERVER&nbsp;与ACCESS、EXCEL的数据转换&nbsp;<br><br>熟悉SQL&nbsp;SERVER&nbsp;2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact-SQL语句进行导入导出操作。在Transact-SQL语句中,我们主要使用OpenDataSource函数、OPENROWSET&nbsp;函数,关于函数的详细说明,请参考SQL联机帮助。利用下述方法,可以十分容易地实现SQL&nbsp;SERVER、ACCESS、EXCEL数据转换,详细说明如下:<br><br>&nbsp;<br><br>一、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL&nbsp;SERVER&nbsp;和ACCESS的数据导入导出<br><br>Transact-SQL语句进行导入导出:<br><br>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在SQL&nbsp;SERVER里查询access数据:<br><br>--&nbsp;======================================================<br><br>SELECT&nbsp;*&nbsp;<br><br>FROM&nbsp;OpenDataSource(&nbsp;'Microsoft.Jet.OLEDB.4.0',<br><br>'Data&nbsp;Source=&quot;c:/DB.mdb&quot;;User&nbsp;ID=Admin;Password=')...表名<br><br>-------------------------------------------------------------------------------------------------<br><br>&nbsp;<br><br>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将access导入SQL&nbsp;server&nbsp;<br><br>--&nbsp;======================================================<br><br>在SQL&nbsp;SERVER&nbsp;里运行:<br><br>SELECT&nbsp;*<br><br>INTO&nbsp;newtable<br><br>FROM&nbsp;OPENDATASOURCE&nbsp;('Microsoft.Jet.OLEDB.4.0',&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Data&nbsp;Source=&quot;c:/DB.mdb&quot;;User&nbsp;ID=Admin;Password='&nbsp;)...表名<br><br>-------------------------------------------------------------------------------------------------<br><br>&nbsp;<br><br>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将SQL&nbsp;SERVER表里的数据插入到Access表中<br><br>--&nbsp;======================================================<br><br>在SQL&nbsp;SERVER&nbsp;里运行:<br><br>insert&nbsp;into&nbsp;OpenDataSource(&nbsp;'Microsoft.Jet.OLEDB.4.0',<br><br>&nbsp;&nbsp;'Data&nbsp;Source=&quot;&nbsp;c:/DB.mdb&quot;;User&nbsp;ID=Admin;Password=')...表名&nbsp;<br><br>(列名1,列名2)<br><br>select&nbsp;列名1,列名2&nbsp;&nbsp;from&nbsp;&nbsp;sql表<br><br>&nbsp;<br><br>实例:<br><br>insert&nbsp;into&nbsp;&nbsp;OPENROWSET('Microsoft.Jet.OLEDB.4.0',&nbsp;<br><br>&nbsp;&nbsp;&nbsp;'C:/db.mdb';'admin';'',&nbsp;Test)&nbsp;<br><br>select&nbsp;id,name&nbsp;from&nbsp;Test<br><br>&nbsp;<br><br>&nbsp;<br><br>INSERT&nbsp;INTO&nbsp;OPENROWSET('Microsoft.Jet.OLEDB.4.0',&nbsp;'c:/trade.mdb';&nbsp;'admin';&nbsp;'',&nbsp;表名)<br><br>SELECT&nbsp;*<br><br>FROM&nbsp;sqltablename<br><br>-------------------------------------------------------------------------------------------------<br><br>&nbsp;<br><br>&nbsp;<br><br>&nbsp;<br><br>&nbsp;<br><br>&nbsp;<br><br>二、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL&nbsp;SERVER&nbsp;和EXCEL的数据导入导出<br><br>&nbsp;<br><br>1、在SQL&nbsp;SERVER里查询Excel数据:<br><br>--&nbsp;======================================================<br><br>SELECT&nbsp;*&nbsp;<br><br>FROM&nbsp;OpenDataSource(&nbsp;'Microsoft.Jet.OLEDB.4.0',<br><br>'Data&nbsp;Source=&quot;c:/book1.xls&quot;;User&nbsp;ID=Admin;Password=;Extended&nbsp;properties=Excel&nbsp;5.0')...[Sheet1$]<br><br>&nbsp;<br><br>下面是个查询的示例,它通过用于&nbsp;Jet&nbsp;的&nbsp;OLE&nbsp;DB&nbsp;提供程序查询&nbsp;Excel&nbsp;电子表格。<br><br>SELECT&nbsp;*&nbsp;<br>FROM&nbsp;OpenDataSource&nbsp;(&nbsp;'Microsoft.Jet.OLEDB.4.0',<br>&nbsp;&nbsp;'Data&nbsp;Source=&quot;c:/Finance/account.xls&quot;;User&nbsp;ID=Admin;Password=;Extended&nbsp;properties=Excel&nbsp;5.0')...xactions<br>-------------------------------------------------------------------------------------------------<br><br>&nbsp;<br><br>2、将Excel的数据导入SQL&nbsp;server&nbsp;:<br><br>--&nbsp;======================================================<br><br>SELECT&nbsp;*&nbsp;into&nbsp;newtable<br><br>FROM&nbsp;OpenDataSource(&nbsp;'Microsoft.Jet.OLEDB.4.0',<br><br>&nbsp;&nbsp;'Data&nbsp;Source=&quot;c:/book1.xls&quot;;User&nbsp;ID=Admin;Password=;Extended&nbsp;properties=Excel&nbsp;5.0')...[Sheet1$]<br><br>&nbsp;<br><br>实例:<br><br>SELECT&nbsp;*&nbsp;into&nbsp;newtable<br><br>FROM&nbsp;OpenDataSource(&nbsp;'Microsoft.Jet.OLEDB.4.0',<br><br>&nbsp;&nbsp;'Data&nbsp;Source=&quot;c:/Finance/account.xls&quot;;User&nbsp;ID=Admin;Password=;Extended&nbsp;properties=Excel&nbsp;5.0')...xactions<br><br>-------------------------------------------------------------------------------------------------<br><br>&nbsp;<br><br>3、将SQL&nbsp;SERVER中查询到的数据导成一个Excel文件<br><br>--&nbsp;======================================================<br><br>T-SQL代码:<br><br>EXEC&nbsp;master..xp_cmdshell&nbsp;'bcp&nbsp;库名.dbo.表名out&nbsp;c:/Temp.xls&nbsp;-c&nbsp;-q&nbsp;-S&quot;servername&quot;&nbsp;-U&quot;sa&quot;&nbsp;-P&quot;&quot;'<br><br>参数:S&nbsp;是SQL服务器名;U是用户;P是密码<br><br>说明:还可以导出文本文件等多种格式<br><br>&nbsp;<br><br>实例:EXEC&nbsp;master..xp_cmdshell&nbsp;'bcp&nbsp;saletesttmp.dbo.CusAccount&nbsp;out&nbsp;c:/temp1.xls&nbsp;-c&nbsp;-q&nbsp;-S&quot;pmserver&quot;&nbsp;-U&quot;sa&quot;&nbsp;-P&quot;sa&quot;'<br><br>&nbsp;<br><br>&nbsp;EXEC&nbsp;master..xp_cmdshell&nbsp;'bcp&nbsp;&quot;SELECT&nbsp;au_fname,&nbsp;au_lname&nbsp;FROM&nbsp;pubs..authors&nbsp;ORDER&nbsp;BY&nbsp;au_lname&quot;&nbsp;queryout&nbsp;C:/&nbsp;authors.xls&nbsp;-c&nbsp;-Sservername&nbsp;-Usa&nbsp;-Ppassword'<br><br>&nbsp;<br><br>在VB6中应用ADO导出EXCEL文件代码:&nbsp;<br><br>Dim&nbsp;cn&nbsp;&nbsp;As&nbsp;New&nbsp;ADODB.Connection<br><br>cn.open&nbsp;&quot;Driver={SQL&nbsp;Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;&quot;<br><br>cn.execute&nbsp;&quot;master..xp_cmdshell&nbsp;'bcp&nbsp;&quot;SELECT&nbsp;col1,&nbsp;col2&nbsp;FROM&nbsp;库名.dbo.表名&quot;&nbsp;queryout&nbsp;E:/DT.xls&nbsp;-c&nbsp;-Sservername&nbsp;-Usa&nbsp;-Ppassword'&quot;<br><br>-------------------------------------------------------------------------------------------------<br><br>&nbsp;<br><br>4、在SQL&nbsp;SERVER里往Excel插入数据:<br><br>--&nbsp;======================================================<br><br>insert&nbsp;into&nbsp;OpenDataSource(&nbsp;'Microsoft.Jet.OLEDB.4.0',<br><br>'Data&nbsp;Source=&quot;c:/Temp.xls&quot;;User&nbsp;ID=Admin;Password=;Extended&nbsp;properties=Excel&nbsp;5.0')...table1&nbsp;(A1,A2,A3)&nbsp;values&nbsp;(1,2,3)<br><br>&nbsp;<br><br>T-SQL代码:<br><br>INSERT&nbsp;INTO&nbsp;&nbsp;<br><br>&nbsp;OPENDATASOURCE('Microsoft.JET.OLEDB.4.0',&nbsp;&nbsp;<br><br>&nbsp;'Extended&nbsp;Properties=Excel&nbsp;8.0;Data&nbsp;source=C:/training/inventur.xls')...[Filiale1$]&nbsp;&nbsp;<br><br>&nbsp;(bestand,&nbsp;produkt)&nbsp;VALUES&nbsp;(20,&nbsp;'Test')
 
To:lisongmagic<br>&nbsp;&nbsp;&nbsp;可能你沒看清楚我的問題,我並不是做簡單的數據導入導出轉換.
 
我照樓上諸位的方法作了,發現都存在一些問題<br>一、首先我在ACCESS數據庫裡面通過ODBC鏈接了SQL,DBF數據表,可是對於記錄比較多的表(大概10000條以上)根本就無法查詢(我在ACCESS和自己的程序中都嘗試過了),每次執行查詢,系統幾乎處於當機狀態。我估計通過ACCESS鏈接(通過ODBC)不能實現我的需求了(查詢數據量比較大的情況下)<br>二、其次我在SQL服務器上建立了兩個鏈接服務器,一個通過JET4.0驅動指向Access數據庫(我在查詢分析器中測試過沒問題),另外指向DBF的數據鏈接(通過OLE&nbsp;DB&nbsp;FOR&nbsp;ODBC驅動)存在這樣的問題:<br>在指向DBF的鏈接服務器中,甚至都可以看到遠程主機上的DBF表,可是我在SQL查詢分析器中執行select&nbsp;*&nbsp;from&nbsp;openquery(test,'select&nbsp;*&nbsp;from&nbsp;demo'),卻提示:不能打開h:/demo.dbf(注:路徑h:/為我建立的網絡共享文件夾)。而指向ACCESS的鏈接服務器則不存在這樣的問題,這讓感到很郁悶,請問這是什麼原因呢?是我建立DBF鏈接服務器時設置不對,還是其它的什麼原因呢?<br>小弟再次謝謝諸位的熱心幫助!
 
你可以建立一些中间件用于查询各个子系统的数据,然后通过控制程序进行查询命令的分解及结果的管理。中间数据的管理可以使用数据库、也可以使用中间数据集合直接查询,关键看那个方式符合你的具体应用及相关操作条件。
 
我就奇怪,现在中国人离开数据库好象就不知道该怎么写程序了.<br><br>真奇怪!&nbsp;&nbsp;难道你们就只会&nbsp;CRUD?
 
分布式查询而已,<br>opendatasource<br>opendataset<br>你不仅数据库不同,而且还在不同的主机上,<br>那你就先建立个链接服务器就行了,<br>sp_addlinkedserver&nbsp;<br>sp_addlinkedsrvlogin<br>小问题,呵呵。。。
 
针对你的问题,提供以下2种分布式查询方案:<br>一、在SQL&nbsp;SERVER&nbsp;2000&nbsp;中建立链接服务器:具体方法参考SQL2000在线帮助文档;<br>二、在ACCESS中建立链接数据表(通过ODBC)。<br>当然通过以上的方法建立起来的链接服务器或者链接数据表在查询时,如果资料比较大,查询效率可能会不是很高。如果你想获得更高的查询效力,楼主还得自己写些中间组件来实现你的分布式查询。<br>以上方法希望能对楼主有所帮助
 
接受答案了.
 
后退
顶部