2017-12-20 85 views
2

SAS Integration Technologies COM 구성 요소를 사용하여 C# .NET 프로젝트에서 SAS 서버에 연결하고 있습니다. SAS Workspace에 문장을 제출하고 OLE DB 공급자 (SAS.IOMProvider)를 사용하여 SAS에서 출력 데이터 세트를로드하려고합니다. 나는이 같은이 성공적으로 사용하는 코드를 할 수 있어요 : 나는 ObjectFactoryMulti2ObjectPool 기능을 사용하려고 할 때SAS Provider for OLE DB (SAS.IOMProvider)가 ObjectPool에서 작동하지 않습니다.

static int Main(string[] args) 
{ 
    var keeper = new ObjectKeeper(); 
    var factory = new ObjectFactoryMulti2(); 
    var server = new ServerDef() 
    { 
     MachineDNSName = "sas.server.com", 
     Protocol = Protocols.ProtocolBridge, 
     Port = 8591, 
     BridgeSecurityPackage = "Negotiate", 
    }; 
    var workspace = (IWorkspace)factory.CreateObjectByServer("Workspace1", true, server, null, null); 

    keeper.AddObject(1, workspace.UniqueIdentifier, workspace); 

    try 
    { 
     using (var conn = new OleDbConnection("Provider=SAS.IOMProvider.1; Data Source=iom-id://" + workspace.UniqueIdentifier)) 
     { 
      // success 
      conn.Open(); 
     } 
    } 
    catch (Exception ex) 
    { 
     System.Console.Error.WriteLine(ex.ToString()); 
     return 1; 
    } 
    finally 
    { 
     keeper.RemoveObject(workspace); 
     workspace.Close(); 
    } 

    return 0; 
} 

그러나 OLE DB 연결이 작동하지 않습니다. 항상 "객체를 찾을 수 없으므로 객체가 이전에 객체 키퍼에 추가되었는지 확인합니다." 다음은 작동하지 않는 코드입니다.

static int Main(string[] args) 
{ 
    var keeper = new ObjectKeeper(); 
    var factory = new ObjectFactoryMulti2(); 
    var server = new ServerDef() 
    { 
     MachineDNSName = "sas.server.com`", 
     Protocol = Protocols.ProtocolBridge, 
     Port = 8591, 
     BridgeSecurityPackage = "Negotiate", 
     MaxPerObjectPool = Environment.ProcessorCount, 
     RunForever = true, 
     RecycleActivationLimit = 100, 
    }; 
    var login = new LoginDef(); 

    var pool = factory.ObjectPools.CreatePoolByServer("Pool1", server, login); 
    var lease = pool.GetPooledObject(null, null, 5000); 
    var workspace = (IWorkspace)lease.SASObject; 

    keeper.AddObject(1, workspace.UniqueIdentifier, workspace); 

    try 
    { 
     using (var conn = new OleDbConnection("Provider=SAS.IOMProvider.1; Data Source=iom-id://" + workspace.UniqueIdentifier)) 
     { 
      // throws System.Data.OleDb.OleDbException: 'The object 1EFCE532-99BA-4A27-AF37-574EAE1CD04C could not be found; make sure it was previously added to the object keeper.' 
      conn.Open(); 
     } 
    } 
    catch (Exception ex) 
    { 
     System.Console.Error.WriteLine(ex.ToString()); 
     return 1; 
    } 
    finally 
    { 
     keeper.RemoveObject(workspace); 
     lease.ReturnToPool(); 
     pool.Shutdown(); 
    } 

    return 0; 
} 

SAS OLE DB 공급자와 SAS 연결 풀링을 사용하는 방법이 있습니까?

답변

1

SAS 지원에서이 질문에 대한 답변을 얻었습니다. 연결 풀을 사용할 때는 작업 영역을 IServerStatus으로 캐스팅하고 IWorkspace.UniqueIdentifier 대신 ServerStatusUniqueID 속성을 사용하여 연결해야합니다.

var pool = factory.ObjectPools.CreatePoolByServer("Pool1", server, login); 
var lease = pool.GetPooledObject(null, null, 5000); 
var workspace = (IWorkspace)lease.SASObject; 
var status = (IServerStatus)lease.SASObject; 

keeper.AddObject(1, workspace.UniqueIdentifier, workspace); 

using (var conn = new OleDbConnection("Provider=SAS.IOMProvider.1; Data Source=iom-id://" + status.ServerStatusUniqueID)) 
{ 
    // success 
    conn.Open(); 
} 

keeper.RemoveObject(workspace); 
lease.ReturnToPool();