2012-02-23 77 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