1

わかりましたので、別のビジネスから送信された cache.dat データベースから情報を抽出しようとしています。ODBC を使用してデータを取得しようとしています。Access にエクスポートしようとすると、samples 名前空間からグローバルを表示できますが、この新しいデータベースからデータを表示できません。

私はこの問題に 2 つの方法で取り組もうとしました。まず、単純に Cache をシャットダウンし、InterSystems\TryCache\mgr\samples にある既存のデータベースを置き換えて、キャッシュを再起動しました。再起動すると、新しいデータベースから管理ポータルにすべてのグローバルが表示されます。Windows ODBC アドミニストレーターから ODBC 接続をテストすると、接続されます。ただし、ODBC を使用して Access データベースにそれらを取り込もうとすると、インポートするテーブルが表示されません。

また、データベースをキャッシュに追加しようとしましたが、エラーが発生しました:

エラー #5805: エクステント 'Config.Databases' の ID キーが一意ではありません

そこにある値をいじってみましたが、役に立ちませんでした。このようなものをいじるのはこれが初めてであり、どんな助けも素晴らしいでしょう。

4

3 に答える 3

1

管理ポータルにアクセスすると、名前空間に定義されたテーブル定義が表示されますか。そうでない場合、アプリケーションは CacheObjectScript で作成されており、オブジェクト/SQL アクセスを提供するクラスは作成されていません。この場合、データ (グローバル構造) を記述するクラスを作成するのはかなりの作業になる可能性があります。

于 2012-02-24T00:23:04.297 に答える
0

マット、CACHE.DAT ファイルを提供した会社は、データへの ODBC アクセスが必要であると指示しましたか? 彼らはデータ/グローバルを説明するドキュメントを提供しましたか? グローバルを説明するドキュメントが提供されていれば、データをマップするクラスを作成できます。何をしたいかによって、これはリソースを大量に消費するプロセスになるか、そうでないかのどちらかになります。

于 2012-02-24T21:35:05.660 に答える
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
}

アクセスからこれを取得するためのコードはありませんが、参考までに、python からこれにアクセスするには (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
于 2012-03-17T03:28:03.783 に答える