2012-10-22 103 views
0

我目前在我的Web服務器上設置了2個ODBC連接。一個連接到我們的企業QAD數據庫,另一個連接到我們的用於擴展數據庫的自定義數據庫。在這個特別的例子中,我在QAD數據庫中有我的員工記錄,然後是自定義數據庫中另一個表中的員工編號。通過OpenEdge ODBC和PHP交叉加入進度數據庫

有什麼辦法讓我在php中建立兩個odbc連接之間的交叉連接,這樣我就不必循環第一個查詢的結果,並根據返回的結果發送幾個查詢我的記錄一起在一個PHP數組?

我已經能夠想到的最好的方法是從我們的自定義數據庫的第一個查詢中構建一個IN子句,將第二個查詢發送到QAD數據庫,然後在php中進行數組合並。但是,與普通的SQL連接相比,這是一個非常緩慢的過程。

+0

OpenEdge,hunh?我有一個有趣的解決方案,但它只適用於JDBC(在OpenEdge 10+上)和Ruby。可能會讓你的場景變得不可行,但是如果不是,請告訴我。 –

回答

1

不確定您是否已經找到解決方案,但有關於如何執行此操作的Progress文章。

Quick Guide To Setting Up MultiDatabase ODBC Connectivity

我也有類似的要求 - 我想創建在主QAD數據庫中的表和我們的自定義數據庫自定義表之間的聯接。我已經測試過了,雖然我的設置略有不同,但它運行良好。我需要從Microsoft SSRS連接到QAD以創建QAD數據報告 - 我需要創建一些標準QAD報告設計人員無法處理的報告。

我在Progress 10.1c上測試過這個方法(這個方法只支持10.1b +)。

所以我採取的步驟是:

  1. 創建oesql.properties配置文件按照相關的主要和自定義數據庫的文章。
  2. 在客戶端計算機上創建ODBC系統DSN(在我的情況下是運行帶有SSRS的SQL Server 2008 R2的Windows Server 2008 R2計算機)以及本文中的其他數據庫引用。
  3. 創建通過ODBC DSN
  4. 在SQL Server中的鏈接服務器創建一個使用了OPENQUERY語法來通過鏈接服務器從QAD提取數據(在我的情況下,這是在Report Server數據庫創建)的視圖。
  5. 使用點3中的視圖作爲數據源創建標準T-SQL查詢。這最終是我的SSRS報告的數據源。

我相信重要的是OS /數據庫和ODBC驅動程序的位版本匹配,但尚未確認。

雖然我的要求與您最終的要求不同,但QAD服務器配置和ODBC設置是關鍵。只要你的PHP客戶端可以在OpenQuery命令方面執行類似的功能,那麼你可能會得到這個工作。我沒有任何PHP經驗,所以不能幫助你。

這似乎有點複雜,但實際上工作得很好,而且在很多情況下,使用QAD瀏覽實際上表現超過查詢數據!

希望這會有所幫助。

編輯: 下面是一個OPENQUERY命令的樣本 - 你可以看到,該表以正常的方式連接的工作原理只是要求,並在表引用附加件。

CREATE VIEW [dbo].[vQADData] AS SELECT * FROM OPENQUERY(LinkedServerName, 
' 
SELECT custTable.item_date AS DESP_DATE, so_mstr.so_site AS SITE, so_mstr.so_po AS PO_NO, so_mstr.so_inv_nbr AS INV_NO, 
     ad_mstr.ad_name AS ADNAME, ad_mstr.ad_city AS ADCITY, ad_mstr.ad_state AS ADSTATE 
FROM customdbname.pub.customtable custTable 
INNER JOIN pub.so_mstr ON so_mstr.so_nbr = custTable.so_nbr 
INNER JOIN pub.ad_mstr ON ad_mstr.ad_addr = so_mstr.so_ship 
INNER JOIN pub.sod_det ON sod_det.sod_nbr = custTable.so_nbr 
WHERE so_mstr.so_site = ''SiteName'' AND so_mstr.so_shipvia = ''SHIPPER'' AND custTable.item_date IS NULL 
') 

然後,只需使用普通的SQL語法訪問視圖。

SELECT * FROM vQADData 
+0

不是我期待的簡單答案,但我認爲這與我將要找到的答案一樣好。 –

0

簡答:您不能在JOIN表之間建立兩個連接。

方案:(在一個單一連接所有的)

  • 默認情況下,在大多數的數據庫,你可以通過表之前前綴的架構名稱,像這樣的加入在不同模式的表格:

(...) FROM defaultDB.TableA INNER JOIN extensionDB.TableA ON ({Condition}) (...)

  • 根據您的數據庫(我不太瞭解Progress DB),您可能無法連接屬於不同服務器模式的表。

  • 加入不同數據庫中的表格(例如:Progress x MySQL)它更加複雜。我聽說Oracle Gateway,一個專有的解決方案,(不太確定)可以實現這最後的情況。

總結:

如果您的情況不符合第一種情形下(這點最明顯的方法),我想在最短的解決辦法是剖析你的代碼優化可能的性能瓶頸。適應你的代碼parallel processing可能是一個更大膽的改進。

+0

不幸的是,我想我需要爲不同的數據庫設置不同的代理,而且我的理解是,他們需要在不同的端口上運行,這迫使我使用兩個獨立的ODBC。如果有證據,但是我會非常有興趣將odbc組合成一個單一的來完成這個任務。 –

1

感謝Tiran提供了他的建議解決方案。對於那些試圖通過Tiran在SQL Server中引用多個表的人,我有額外的輸入。

我試圖從多個來源(Progress),同一個表結構中同時提取數據並將其插入到我們的數據倉庫(SQL Server)中。所以我只是試圖在不同的數據庫中進行多個相同結構的表的聯合。 Tiran的解決方案讓我走上了同樣的道路,但Progress數據庫的鏈接是一個繁瑣的過程,需要我找到一個有2-3天空閒時間(他的引用)的Progress DBA來將它們放在一起。當我直接與Progress進行交流時,他們還指出,如果我在Progress一側創建了一個帶有聯合的視圖,它將順序地從視圖中的每個源提取數據,而不是同時提取數據。但是,這讓我發現了另一個發現,它似乎將解決我們的需求,並完全跳過處理Progress側鏈接表的問題。

下面是一個有三個來源的例子,同樣的表格(這也適用於交叉來源加入不同的表格)。這裏提供的所有名稱僅供參考。

Source 1 - Table_A 
Source 2 - Table_A 
Source 3 - Table_A 
  • 創建ODBC連接到名爲源1源1。
  • 創建到Source 2的名爲source2的ODBC連接。
  • 創建一個到名爲source3的源3的ODBC連接。 (請注意,您通常要確保將連接設置設置爲「未提交讀取」)。

在SQL Server中,創建到每個源的鏈接服務器連接。

ls_source1 
ls_source2 
ls_source3 

在你需要引用的進展數據庫,創建加入了三種不同的鏈接服務器連接在一起,利用工會看你的SQL Server數據庫。鏈接的服務器引用都需要使用openquery。本示例在每個鏈接的服務器源中使用select *假定所有列都從每個源命名並構造相同。

CREATE VIEW table_name_v as 
SELECT * 
FROM 
(SELECT * 
FROM OPENQUERY(ls_source1, 
'select * 
from source1.dbo.Table_A 
') 
union 
SELECT * 
FROM OPENQUERY(ls_source2, 
'select * 
from source2.dbo.Table_A 
' 
union 
SELECT * 
FROM OPENQUERY(ls_source3, 
'select * 
from source3.dbo.Table_A 
' 
) 
) x 

通過創建視圖,您現在可以同時查詢不同進度源中的所有三個表。進度端沒有額外的設置是必要的。

有一個重要的警告,我目前正在爲解決的工作。如果您在使用64位SQL Server的64位計算機上,則需要使用64位驅動程序通過鏈接服務器選項連接到Progress數據庫。我的需求要求我在同一臺機器上同時安裝了32位和64位驅動程序,並且遇到了這些問題,因爲顯然當他們在同一臺機器上時,他們並不能很好地一起玩。我已經能夠在同一臺機器上安裝64位和32位驅動程序(Progress的網站上有一個小故障,本應該給我一個該驅動程序的鏈接,但是我能夠找到某人指引我到正確的地方以檢索64位odbc驅動程序,普通人不需要兩個驅動程序,只需使用64位。作爲替代解決方法,如果我無法在同一臺機器上同時存在兩個驅動程序,我發現並確認Connx公司提供的驅動程序提供了一個64位/ 32位橋接器,可以解決這個問題,理想情況下,不需要第三方軟件。我設置並正在使用的鏈接服務器不能正常運行。前進兩步,退一步......

只是想我會分享我的發現,因爲我確信還有其他人在尋找。

+0

這是很好的信息。我很好奇,如果通過連接從應用程序到3個數據源的進程,並在應用程序本身中進行連接,這樣做的確會有很大的性能提升,但不管怎麼說都很好。 –