【问题标题】:Using application roles with DataReader将应用程序角色与 DataReader 一起使用
【发布时间】:2013-05-21 20:41:47
【问题描述】:

我有一个应用程序应该使用数据库中的应用程序角色。 我正在尝试使用实际使用 Subsonic (2) 运行的查询来完成这项工作。 为此,我创建了自己的 DataProvider,它继承自 Subsonic 的 SqlDataProvider。 它覆盖 CreateConnection 函数,并在创建连接后调用 sp_appsetrole 设置应用程序角色。 这部分工作正常,我可以使用应用程序角色获取数据。

当我尝试取消设置应用程序角色时出现问题。在查询完成后,我在代码中找不到调用我的提供程序的任何地方,所以我尝试通过更改 SubSonic 代码来添加我自己的。问题是 Subsonic 使用数据阅读器。它从数据读取器加载数据,然后将其关闭。

  1. 如果我在数据读取器关闭之前取消设置应用程序角色,我会收到一条错误消息:已经有一个打开的数据读取器与此命令关联,必须先关闭。时间>
  2. 如果我在数据读取器关闭之后取消设置应用程序角色,我会收到一条错误消息,提示 ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态为关闭。

我似乎找不到在不关闭连接的情况下关闭数据读取器的方法。

【问题讨论】:

    标签: sql-server subsonic sqldatareader


    【解决方案1】:

    每个查询都必须使用角色吗?

    如果没有,您可以使用 SharedDbConnectionScope()

    using(var scope = new SharedDbConnectionScope())
    {
    
        // within this using block you have a single connection
        // that isn't closed until scope.Dispose() is called
        // (happens automatically while leaving this block)
        // and you have access to scope.CurrentConnection
    
        // Do your init stuff
        SetRole(scope.CurrentConnection);
    
        var product = new Product();
        product.Code = "12345";
        product.Save();
    
        // Revert to normal
        UnsetRole(scope.CurrentConnection);
    
    }
    

    【讨论】:

    • 我做了类似的事情。我创建了一个继承 SharedDbConnectionScope 的类。我在其构造函数中设置角色,并在处置时取消设置。当您有少量查询时,这确实是一个很好的解决方案。但是,我需要对大量查询执行此操作。我最终没有使用应用程序角色。
    【解决方案2】:

    问题在于 Subsonic 使用 CloseConnection 执行其阅读器。 如果我让它不关闭连接,我可以在阅读器关闭后取消设置应用程序角色。

    【讨论】:

      【解决方案3】:

      也许你可以像这样订阅事件:

      Connection.StateChange += new System.Data.StateChangeEventHandler(Connection_StateChange);
      

      然后根据这个连接的新状态做一些动作:

      if(e.CurrentState== System.Data.ConnectionState.Open)
      dbworker.ExecuteCommand("EXEC sp_setapprole application, 'password'");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 2016-11-29
        • 2012-12-29
        相关资源
        最近更新 更多