enterprise-librarysqldatareaderdaab.net

Cast error on SQLDataReader


My site is using enterprise library v 5.0. Mainly the DAAB. Some functions such as executescalar, executedataset are working as expected. The problems appear when I start to use Readers

I have this function in my includes class:

Public Function AssignedDepartmentDetail(ByVal Did As Integer) As SqlDataReader
    Dim reader As SqlDataReader
    Dim Command As SqlCommand = db.GetSqlStringCommand("select seomthing from somewhere where something = @did")
    db.AddInParameter(Command, "@did", Data.DbType.Int32, Did)
    reader = db.ExecuteReader(Command)
    reader.Read()
    Return reader
End Function

This is called from my aspx.vb like so:

reader = includes.AssignedDepartmentDetail(Did)
If reader.HasRows Then
    TheModule = reader("templatefilename")
    PageID = reader("id")
Else
    TheModule = "#"
End If

This gives the following error on db.ExecuteReader line:

Unable to cast object of type 'Microsoft.Practices.EnterpriseLibrary.Data.RefCountingDataReader' to type 'System.Data.SqlClient.SqlDataReader'.

Can anyone shed any light on how I go about getting this working. Will I always run into problems when dealing with readers via entlib?


Solution

  • I think I have a working solution.

    enter code here
    
        ' Create the Database object, using the default database service. The
        ' default database service is determined through configuration.
        Dim db As Microsoft.Practices.EnterpriseLibrary.Data.Database = EnterpriseLibraryContainer.Current.GetInstance(Of Microsoft.Practices.EnterpriseLibrary.Data.Database)(DatabaseName)
    
        Dim dbCommand As DbCommand
        dbCommand = db.GetStoredProcCommand(StoredProcedureName)
    
        'create a new database connection based on the enterprise library database connection
        Dim dbConnection As System.Data.Common.DbConnection
        dbConnection = db.CreateConnection
        dbConnection.Open()
    
        'set the dbCommand equal to the open dbConnection
        dbCommand.Connection = dbConnection
    
        'return a ADO sqlDatareader but still managed by the EnterpriseLibrary
        Return dbCommand.ExecuteReader(CommandBehavior.CloseConnection)