Доступ к cache.dat через ODBC - PullRequest
1 голос
/ 24 февраля 2012

Хорошо, поэтому я пытаюсь извлечь информацию из базы данных cache.dat, отправленной из другого предприятия. Я пытаюсь получить данные с помощью ODBC. Я могу видеть глобальные переменные из пространства имен примеров при попытке экспорта в Access, но не могу получить данные из этой новой базы данных для отображения.

Я пытался решить эту проблему двумя способами. Во-первых, я просто выключил кэш, заменил существующей базы данных в InterSystems \ TryCache \ mgr \ samples и перезапустите кеш. После перезапуска я вижу все глобальные переменные в портале управления из новой базы данных. Если я проверяю соединение ODBC от администратора Windows ODBC, оно соединяется. Однако, когда я пытаюсь вытащить их в базу данных доступа, используя ODBC, не отображаются таблицы для импорта.

Я также пытался добавить базу данных в мой кэш, но он выдал ошибку:

ОШИБКА # 5805: ключ идентификатора не уникален для экстента 'базы данных Config.D

Я пытался дурачиться со значениями там, но безрезультатно. Это мой первый раз, когда я возиться с чем-то подобным и любым другим, ЛЮБАЯ помощь будет потрясающей.

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Если вы заходите на портал управления, вы видите какие-либо определения таблиц, определенные для вашего пространства имен.Если нет, приложение было написано на CacheObjectScript, и не было создано ни одного класса для предоставления доступа к объектам / SQL.Если это так, то создание классов, описывающих данные (глобальные структуры), может оказаться довольно трудоемким.

0 голосов
/ 17 марта 2012

Если вы хотите получить прямой доступ к глобальным переменным, вы можете создать хранимую процедуру, которая сделает это. Прежде чем сделать это, вы должны учитывать последствия для безопасности - все глобальные данные будут доступны всем, у кого есть доступ 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
0 голосов
/ 25 февраля 2012

Мэтт, указала ли компания, которая предоставила файл CACHE.DAT, что вам нужен ODBC доступ к данным?Предоставили ли они какой-либо документ, описывающий данные / глобальные переменные?Если бы они предоставили документ, описывающий глобальные переменные, вы могли бы создать классы, отображающие данные.В зависимости от того, что вы хотите сделать, это может быть ресурсоемким процессом или нет.

...