2017-12-20 57 views
2

SAS Integration TechnologiesのCOMコンポーネントを使用して、C#.NETプロジェクトからSAS Serverに接続しています。ステートメントをSAS Workspaceに提出してから、OLE DBプロバイダ(SAS.IOMProvider)を使用してSASから出力データセットをロードします。私はObjectFactoryMulti2ObjectPool機能を使用しようとすると、OLE DB接続は動作しません、しかし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; 
} 

:私はこのような本に成功し使用してコードを実行することができています。常に「オブジェクトが見つかりませんでした。オブジェクトキーパーに以前に追加されたことを確認してください。」

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(); 
関連する問題