2012-02-23 3 views
1

다른 비즈니스에서 보낸 cache.dat 데이터베이스에서 정보를 추출하려고합니다. ODBC를 사용하여 데이터를 가져 오려고합니다. Access로 내보낼 때 샘플 네임 스페이스에서 전역을 볼 수 있지만이 새 데이터베이스의 데이터를 표시 할 수 없습니다.ODBC를 통해 cache.dat에 액세스

저는이 문제를 두 가지 방법으로 해결하려고했습니다. 먼저 캐시를 종료하고 InterSystems \ TryCache \ mgr \ samples에있는 기존 데이터베이스를 바꾼 다음 캐시를 다시 시작하기 만하면됩니다. 다시 시작하면 새 데이터베이스에서 관리 포털의 모든 전역을 볼 수 있습니다. Windows ODBC 관리자로부터 ODBC 연결을 테스트하면 연결됩니다. 그러나 ODBC를 사용하여 액세스 데이터베이스로 가져 오려고하면 가져올 테이블이 없습니다.

나는 또한 내 캐시에 데이터베이스를 추가하려했지만 그것은 나에게 오류를 준 :

5805 오류 번호 : 범위에 대한 고유하지 않은 ID 키 'Config.Databases'나는 바보하려고

그곳에있는 값들과 함께 주위에 있지만 아무 소용이 없습니다. 이것은 나의 처음으로 이것과 같은 무엇이라도 어 지르고있다. 그리고 어떤 도움이라도 굉장 할 것이다.

답변

1

관리 포털에 액세스하면 네임 스페이스에 대해 정의 된 테이블 정의가 표시됩니다. 그렇지 않은 경우 응용 프로그램은 Object/SQL 액세스를 제공하기 위해 작성된 클래스가없는 CacheObjectScript로 작성되었습니다. 이 경우 데이터를 설명하는 클래스를 만드는 데 상당한 양의 작업이 필요할 수 있습니다 (글로벌 구조).

+0

내가 관리로 이동 Portal과 샘플 네임 스페이스 살펴보기 우리에게 전송 된 데이터베이스의 모든 전역을 볼 수 있습니다. 보기를 클릭하여 해당 데이터를 볼 수도 있습니다. 그러나 ODBC 데이터베이스를 사용하여 액세스 데이터베이스 또는 SQL 서버 db로 내보낼 때 테이블 중 아무 것도 표시되지 않습니다. –

+0

매트 - SMP 내부에서 새 데이터베이스가 포함 된 네임 스페이스에 대한 SQL> 스키마 페이지로 이동하십시오. . 전역에서보고있는 데이터를 나타내는 스키마/테이블이 있습니까? 제 생각에 스티븐 (Stephen)은 ODBC 연결을 통해 전역에있는 데이터를 캐쉬 영속 클래스와 연결하여 가시화 할 필요가 있다고 생각합니다. – mccrackend

+0

SQL> 스키마로 이동하여 새 데이터베이스와 함께 네임 스페이스로 이동하면 아무 것도 없습니다. 당신이 말하는 것은 데이터를 저장하는 자체 방법을 알고 있기 때문에 캐시 내부에서 볼 수 있다는 것입니다. 반면 ODBC는 캐시 영구 클래스로 만들지 않는다는 것을 모릅니다. 제가 말씀 드렸듯이, 제가이 시스템으로 일한 것은 이번이 처음입니다. –

0

Matt, CACHE.DAT 파일을 제공 한 업체가 ODBC 데이터에 대한 액세스? 데이터/전역을 설명하는 문서를 제공 했습니까? 그들이 전역을 설명하는 문서를 제공하면 데이터를 매핑하는 클래스를 만들 수 있습니다. 원하는 작업에 따라 리소스 집약적 인 프로세스가 될 수도 있고 그렇지 않을 수도 있습니다.

+0

아니요, 그들은 ODBC 액세스에 관해 아무 말도하지 않았습니다. 필자는 그들이 ODBC에 데이터를 브리징했다는 것을 의심 스럽지만, 이제는 더 많은 것을 알게되었습니다. 또한 아니요, 그들은 해당 글로벌에 대한 문서를 보내지 않았습니다. 나는 이것이 자신들의 데이터에 어떤 문서가 있는지 묻기 위해 다음 단계가 될 것이라고 생각한다. 내가 원하는 것은 액세스 또는 SQL 서버 db에 직접 데이터를 가져 와서 거기에서 갈 수 있습니다. –

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 
관련 문제