1) First look at the exception sources - for the cast to DbConnection, perhaps it is overly restrictive, but there are some methods on DbConnection not available for IDbConnection. 2) For the cast to SqlException, such cast should happen only in the driver and possibly dialect for SqlServer. Perhaps you can inherit from those too to make them understand your wrapped connection and "unwrap" it.
/Oskar 2012/9/20 Rich Miller <[email protected]> > I have implemented a new class called ApplicationRoleConnectionProvider in > VB.NET so that I can make use of MS SQL Server application roles, and I > substituted it in for the DriverConnectionProvider in the nhibernate > configuration. The implementation of the GetConnection and CloseConnection > methods are as follows: > > Public Class ApplicationRoleConnectionProvider > Inherits DriverConnectionProvider > Public Overrides Function GetConnection() As IDbConnection > Try > > Dim connection As IDbConnection = MyBase.GetConnection() > > Dim cookie As Byte() > > Using cmd As SqlCommand = connection.CreateCommand() > cmd.CommandType = CommandType.StoredProcedure > cmd.CommandText = "sp_setapprole" > cmd.Parameters.Add(New SqlParameter("@rolename", > "rolename")) > cmd.Parameters.Add(New SqlParameter("@password", > "rolepassword")) > cmd.Parameters.Add(New SqlParameter("@fCreateCookie", > True)) > > cmd.Parameters.Add(New SqlParameter() With > {.ParameterName = "@cookie", > .DbType = > DbType.Binary, > .Direction > = ParameterDirection.Output, > .Size = > 8000}) > > cmd.ExecuteNonQuery() > Dim outVal As SqlParameter = cmd.Parameters("@cookie") > > ' This returns a byte array value for the cookie > generated > cookie = outVal.Value > > ' Return connection > Return New > ApplicationRoleConnectionWrapper(connection, cookie) > > End Using > Catch > Throw > End Try > End Function > > Public Overrides Sub CloseConnection(ByVal conn As IDbConnection) > > Dim myConn As ApplicationRoleConnectionWrapper = conn > If myConn IsNot Nothing Then > Using cmd As IDbCommand = myConn.CreateCommand() > cmd.CommandType = CommandType.StoredProcedure > cmd.CommandText = "sp_unsetapprole" > cmd.Parameters.Add(New SqlParameter("@cookie", > myConn.Cookie)) > cmd.ExecuteNonQuery() > End Using > End If > > MyBase.CloseConnection(conn) > End Sub > End Class > > > When I attempt to use a session to query the database, an exception is > thrown indicating that *ApplicationRoleConnectionWrapper cannot be cast > to System.Data.Common.DBConnection*. ApplicationRoleConnectionWrapper > implements IDBConnection and passes all method calls onto the enclosed > connection object passed to it in the constructor. It also maintains the > cookie value returned from SQL Server for later use when the connection is > closed. If I modify ApplicationRoleConnectionWrapper to descend from > DBConnection and pass a SqlServerConnection object to its constructor, the > exception raised when querying is *ApplicationRoleConnectionWrapper > cannot be cast to System.Data.Common.SqlConnection.* I cannot create a > connection wrapper that inherits from SqlConnection as the class is sealed > and cannot be used as a base class for a new class. > > Can anyone see what I've done wrong in this code? Has anyone successfully > written a custom DriverConnectionProvider class for using MS SQL Server > application roles? NHibernate version is 3.3.1.4000. > > Thanks for any help. > > Rich > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/nhusers/-/RJ9s52XSJQYJ. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
