1

好的,所以我试图从另一个企业发送的 cache.dat 数据库中提取信息。我正在尝试使用 ODBC 获取数据。尝试导出到 Access 时,我能够从示例命名空间中看到全局变量,但我无法从这个新数据库中获取数据来显示。

我试图以两种方式解决这个问题。首先,我只是简单地关闭了 Cache,替换了 InterSystems\TryCache\mgr\samples 中现有的数据库并重新启动了缓存。重新启动后,我可以从新数据库中看到管理门户中的所有全局变量。如果我从 Windows ODBC 管理员测试 ODBC 连接,它会连接。但是,当我尝试使用 ODBC 将它们拉入访问数据库时,没有显示要导入的表。

我也尝试将数据库添加到我的缓存中,但它给了我错误:

错误 #5805:ID 键对于范围“Config.Databases”不是唯一的

我试图愚弄那里的价值观,但无济于事。这是我第一次搞砸这样的事情,任何帮助都会很棒。

4

3 回答 3

1

如果您访问管理门户,您是否会看到为您的命名空间定义的任何表定义。如果不是,应用程序是用 CacheObjectScript 编写的,没有创建任何类来提供对象/SQL 访问。如果是这种情况,那么创建描述数据的类(全局结构)可能是相当多的工作。

于 2012-02-24T00:23:04.297 回答
0

Matt,提供 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 回答