首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适用于OLE DB的SAS提供程序(SAS.IOMProvider)不适用于ObjectPool

适用于OLE DB的SAS提供程序(SAS.IOMProvider)不适用于ObjectPool
EN

Stack Overflow用户
提问于 2017-12-21 01:23:32
回答 1查看 594关注 0票数 2

我正在使用SAS集成技术COM组件从C# .NET项目连接到SAS服务器。我希望将语句提交到SAS工作区,然后使用OLE DB提供程序(SAS.IOMProvider)从SAS加载输出数据集。我可以使用下面这样的代码成功地做到这一点:

代码语言:javascript
复制
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;
}

但是,当我尝试使用ObjectFactoryMulti2ObjectPool功能时,OLE DB连接不起作用。它总是抛出“无法找到对象;请确保它之前已被添加到对象保持器中”。下面是不起作用的代码:

代码语言:javascript
复制
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连接池与SAS OLE DB提供程序一起使用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 05:46:03

从SAS支持部门得到了这个问题的一个很好的答案。在使用连接池时,您必须将工作区强制转换为IServerStatus,并使用其ServerStatusUniqueID属性而不是IWorkspace.UniqueIdentifier进行连接。

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47911351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档