none
請問如何將MarshalByRefObject轉成DbDataReader型態 RRS feed

  • 問題

  • 請教一個問題,因為有使用Oracle Data Provider來存取資料庫,而Oracle.DataAccess.Client中的OracleDataReader是從MarshalByRefObject繼承而來,並非如.Net Framework中是從DbDataReader繼承而來,請問該如何能將這個物件轉成DbDataReader的物件型態呢?謝謝!!

    有試過(DbDataReader) OracleDataReaderObject,不行的,謝謝!!

    2008年1月14日 上午 09:45

解答

  • Hi Thinker,

     

    我想,問題應該出在ODAC.NET的版本,下載新的版本後應能解決問題.

     

    1. 所使用的ODAC.NET 版本, 我取得的Oracle Data Access Components (ODAC) 11.1.0.6.20

        中,附有兩個版本的Data Access Component,一個是.NET 1.x,另一個是.NET 2.x,

        確認.NET 2.x的確已經繼承自System.Data.Common中的抽象類別(DbDataReader,DbCommand...),

    2. 除了DbDataReader外,還有IDataReader,IDataRecord等介面可用.

     

    2008年1月15日 上午 06:09

所有回覆


  • DbDataReader 的 Base Class 是 MarshalByRefObject
    

    public abstract class DbDataReader : MarshalByRefObject, IDataReader, 
    IDisposable, IDataRecord, IEnumerable

    ===============================================================================

    OracleDataReader 的 Base Class 是 DbDataReader
    public sealed class OracleDataReader : DbDataReader


    ===================================================================
    所以 應該是可以的

    command.CommandText = "SELECT * FROM OracleTypesTable";
    DbDataReader reader = command.ExecuteReader()  as DbDataReader;




    2008年1月14日 下午 03:18
  • 我原本也是認為可以,以下是我的程式碼

    public DbDataReader ExecuteReader(string ProcedureName)
            {
                OracleDataReader dataReader;          

                this._command.CommandText = ProcedureName;

                if (this._connection.State == ConnectionState.Closed)
                {
                    this._connection.Open();
                }

                try
                {
                    dataReader = this._command.ExecuteReader();
                }
                catch (DbException ex)
                {
                    throw (ex);
                }

                return (DbDataReader) dataReader;
            }

    會有以下的錯誤訊息

    無法將型別 'Oracle.DataAccess.Client.OracleDataReader' 的物件轉換為型別 'System.Data.Common.DbDataReader'。

    亦或是我自己轉型的方式錯誤了~麻煩了~Thx

    2008年1月15日 上午 01:07
  • HI

     

    我 剛剛  用你的   code  試了

     

    重新  編譯   並未跑出  錯誤訊息

     

    =================

     

    主要差別在

     

    你的

     dataReader    是   'Oracle.DataAccess.Client.OracleDataReader'

     

    我使佣的是 

     

    System.Data.OracleClient.OracleDataReader   dataReader;

     

    ==============

     

    所以 請改成

     

    public DbDataReader ExecuteReader(string ProcedureName)
      {
           

         System.Data.OracleClient.OracleDataReader   dataReader;

            .

            .

            .

     

    }

     

     

    2008年1月15日 上午 01:35
  • 主要也是我們之前在使用System.Data.OracleClient並無法正常運作,有查了一下,記得那時是有注意到,其客戶端需在Oracle 8i(8.1.7)以上,我們公司目前的Client..為6....,還有其它一些開發上的問題是其它同事發生的,所以後來去Oracle官方網站上,拿Oracle Data Provider來開發,而目前專案已經有一部份完成,所以不太可能把Reference改掉,畢竟整個專案也不是我個人完全負責...我只負責一部份~~

    而目前會遇到這個問題,主要是目前是要把資料庫的存取方式整理成共同介面~所以才遇到這個問題,不然是不會遇到目前的問題,若是真的不行,我再看看能不能用其它較耗資源的方式來處理好了~

    2008年1月15日 上午 02:06
  •  

    OH OH  ^^  瞭解

    ================

     

    類別 の 継承    祖譜

    System.Object

      System.MarshalByRefObject

        System.Data.Common.DataReader

          System.Data.Common.DbDataReader(僅 ADO.NET 2.0 )

            Oracle.DataAccess.Client.OracleDataReader

     

     

     

    宣告

    // ADO.NET 2.0: C#
    public sealed class OracleDataReader : DbDataReader, IEnumerable,
       IDataReader, IDisposable, IDataRecord
    
    
    // ADO.NET 1.x: C#
    public sealed class OracleDataReader : MarshalByRefObject, IEnumerable,
       IDataReader, IDisposable, IDataRecord
    
    ================
    由上面 得知
    如果 使佣 ADO.NET 2.0   將  OracleDataReader  轉換 DbDataReader  應該是沒問體
     
     
     
     
    2008年1月15日 上午 02:26
  • 基本上,若是都屬於.Net Framwork的話,我想型態上的轉換大概都還ok~麻煩的大概也就是像這種吧~目前使用Oracle這個~就是Oracle StoreProcedure輸出的型態和接收上的處理記得好像某一個資料型態上會有問題~只能轉成Varchar來處理....

     

    2008年1月15日 上午 02:30
  • Hi Thinker,

     

    我想,問題應該出在ODAC.NET的版本,下載新的版本後應能解決問題.

     

    1. 所使用的ODAC.NET 版本, 我取得的Oracle Data Access Components (ODAC) 11.1.0.6.20

        中,附有兩個版本的Data Access Component,一個是.NET 1.x,另一個是.NET 2.x,

        確認.NET 2.x的確已經繼承自System.Data.Common中的抽象類別(DbDataReader,DbCommand...),

    2. 除了DbDataReader外,還有IDataReader,IDataRecord等介面可用.

     

    2008年1月15日 上午 06:09
  • 嗯~我們是用10.x~感謝您提供的資訊啦~這真的是一個好消息~

    可以順便請問若是我客戶端的版本都是8以上,那麼使用System.Data.OracleClient和使用ODP .NET的差異在那??

    畢竟對我這種來說,能使用原本工具裡的是儘量使用,能避免使用第三方工具或元件就避免 ~可是Oracle發展ODP .NET,我想也是有它的考量在~否則若是原本工具就已經很好的話,那大可不必再發展另一個~

     

    2008年1月15日 上午 09:20
  •  

       呵,這個問題我就不清楚了,或許ODP.NET的網站能給您較多的資訊.

    不過我想Oracle既然會花時間開發這個Driver,應該有其獨到之處吧.

     

     

    2008年1月15日 下午 12:02