Использование ролей приложений с DataReader - PullRequest
0 голосов
/ 16 января 2011

У меня есть приложение, которое должно использовать роль приложения из базы данных. Я пытаюсь заставить эту работу работать с запросами, которые на самом деле выполняются с использованием Subsonic (2). Для этого я создал свой собственный DataProvider, который наследуется от SqlDataProvider от Subsonic. Он переопределяет функцию CreateConnection и вызывает sp_appsetrole, чтобы установить роль приложения после создания соединения. Эта часть работает нормально, и я могу получать данные, используя роль приложения.

Проблема возникает, когда я пытаюсь сбросить роль приложения. Я не смог найти места в коде, где мой поставщик вызывается после выполнения запроса, поэтому я попытался добавить свое собственное, изменив код SubSonic. Проблема в том, что Subsonic использует считыватель данных. Он загружает данные из считывателя данных, а затем закрывает их.

  1. Если я отменяю роль приложения до , устройство чтения данных закрывается, я получаю сообщение об ошибке: Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым.
  2. Если я отменяю роль приложения после , устройство чтения данных закрывается, я получаю сообщение об ошибке ExecuteNonQuery требует открытого и доступного соединения. Текущее состояние соединения закрыто.

Кажется, я не могу найти способ закрыть считыватель данных, не закрыв соединение.

Ответы [ 3 ]

0 голосов
/ 17 января 2011

Нужно ли использовать роль для каждого запроса?

Если нет, вы можете использовать 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);

}
0 голосов
/ 21 мая 2013

Может быть, вы можете подписаться на событие следующим образом:

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

И затем выполнить некоторые действия в соответствии с новым состоянием этого соединения:

if(e.CurrentState== System.Data.ConnectionState.Open)
dbworker.ExecuteCommand("EXEC sp_setapprole application, 'password'");
0 голосов
/ 17 января 2011

Проблема в том, что Subsonic выполняет свой ридер с CloseConnection. Если я не установлю соединение, я смогу сбросить роль приложения после закрытия считывателя.

...