2012-02-23 115 views
1

好的,所以我試圖從另一個業務發送的cache.dat數據庫中提取信息。我正在嘗試使用ODBC獲取數據。在嘗試導出到Access時,我能夠從樣本命名空間中看到全局變量,但我無法從此新數據庫中獲取數據以顯示出來。通過ODBC訪問cache.dat

我試着用兩種方法解決這個問題。首先,我只需關閉Cache,將InterSystems \ TryCache \ mgr \ samples中的現有數據庫替換爲 ,然後重新啓動緩存。一旦我重新啓動,我可以從新數據庫中看到管理門戶中的所有全局變量。如果我測試從ODBC ODBC管理員連接的ODBC連接。但是,當我嘗試使用ODBC將它們拉入訪問數據庫時,沒有顯示要導入的表。

我也嘗試將數據庫添加到我的緩存,但它給我的錯誤:

錯誤#5805:ID鍵不是唯一的程度「Config.Databases」

我試圖愚弄周圍的價值在那裏,但無濟於事。這是我第一次搞這樣或那樣的事情,任何幫助都會很棒。

回答

1

如果您訪問管理門戶,您是否看到爲您的名稱空間定義的任何表定義。如果沒有,則應用程序被編寫在CacheObjectScript中,沒有創建用於提供對象/ SQL訪問的類。如果是這種情況,那麼創建描述數據的類(全局結構)可能是相當多的工作。

+0

當我去管理Portal並查看Samples命名空間我可以看到發送給我們的數據庫中的所有全局變量。我甚至可以點擊查看並查看數據。但是,當我嘗試使用ODBC將它導出到訪問數據庫或sql服務器數據庫時,沒有任何表顯示出來...... – 2012-02-24 14:31:36

+0

Mat-當在SMP中時,導航到包含新數據庫的名稱空間的SQL> Schema頁面。您是否看到任何表示您在全局變量中查看的數據的模式/表格?我認爲Stephen是正確的,因爲您需要將全局數據中的數據連接到緩存持久化類,以便通過ODBC連接使其可見。 – mccrackend 2012-02-24 18:25:09

+0

當我轉到SQL> Schemas並使用新數據庫進入命名空間時,那裏什麼也沒有。 所以你說的是它在緩存中是可見的,因爲它知道它自己的存儲數據的方法,而ODBC不知道,除非我讓它成爲一個緩存持久化類?就像我說的那樣,這是我第一次使用這個系統。 – 2012-02-24 20:56:05

0

馬特, 提供CACHE.DAT文件的業務是否表明您應該有ODBC訪問數據? 他們提供了一些描述數據/全局變量的文檔嗎?如果他們提供了描述全局變量的文檔,您可以創建映射數據的類。取決於你想做什麼,這可能是一個資源密集型的過程。

+0

不,他們沒有提到ODBC訪問。我懷疑他們是否已經將他們的數據連接到ODBC,但現在我可以問他們我對它有更多的瞭解。 另外,不,他們沒有發送他們的全球文件。我認爲這將是我的下一步,要問他們對他們的數據有什麼文件。 我想要做的就是直接將數據拉到訪問或sql服務器數據庫,然後我可以從那裏去。 – 2012-02-24 23:22:50

0

如果你想直接訪問全局變量,你可以創建一個存儲過程。在執行此操作之前,您應該考慮安全隱患 - 它會將全局數據公開給任何具有ODBC訪問權限的人。

下面是一個存儲過程的示例,該存儲過程返回最多9個全局下標的值以及該節點的值。如果需要,您可以很容易地修改它。

Query OneGlobal(GlobalName As %String) As %Query(ROWSPEC = "NodeValue:%String,Sub1:%String,Sub2:%String,Sub3:%String,Sub4:%String,Sub5:%String,Sub6:%String,Sub7:%String,Sub8:%String,Sub9:%String") [SqlProc] 
{ 
} 

ClassMethod OneGlobalExecute(ByRef qHandle As %Binary, GlobalName As %String) As %Status 
{ 
    S qHandle="^"_GlobalName 
    Quit $$$OK 
} 

ClassMethod OneGlobalClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = OneGlobalExecute ] 
{ 
    Quit $$$OK 
} 

ClassMethod OneGlobalFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = OneGlobalExecute ] 
{ 

    S Q=qHandle 
    S Q=$Q(@Q) b 
    I Q="" S Row="",AtEnd=1 Q $$$OK 
    S Depth=$QL(Q) 
    S $LI(Row,1)=$G(@Q) 
    F I=1:1:Depth S $LI(Row,I+1)=$QS(Q,I) 
    F I=Depth+1:1:9 S $LI(Row,I+1)="" 
    S AtEnd=0 
    S qHandle=Q 
    Quit $$$OK 
} 

我沒有代碼,供您訪問得到這個,但作爲參考,從蟒蛇訪問此您可以使用(與pyodbc):

import pyodbc 
import win32com.client 
import urllib2 

class CacheOdbcClient: 

    connectionString="DSN=MYCACHEDSN" 

    def __init__(self): 
     pass 

    def getGlobalAsOverlyLargeList(self): 
     connection=pyodbc.connect(self.connectionString) 
     cursor=connection.cursor() 
     cursor.execute("call MyPackageName.MyClassName_OneGlobal ?","MYGLOBAL") 
     list=[] 
     for row in cursor : 
      list.append((row.NodeValue,row.Sub1,row.Sub2,row.Sub3,row.Sub4,row.Sub5,row.Sub6,row.Sub7,row.Sub8,row.Sub9)) 
     return list