C# CreateDataAdapter 建立 DbDataAdapter,以及用DataTable的Load方法擷取資料

來源:互聯網
上載者:User

標籤:style   blog   color   使用   io   資料   for   問題   

ADO.NET中 有了DbConnection,就可用DbConnection的CreateCommand 建立DbCommand,BeginTransaction建立DbTransaction

可以十分方便的實現原廠模式,操作不同的資料庫。

 

但是唯獨DbDataAdapter這個重要的對象無法通過DbConnection或DbCommand來建立,也無法執行個體化,必須使用SqlDataReader這種明確的類來建立執行個體,導致 擷取資料 的方法不能在基類實現

 

以下是兩個解決辦法: 

 

1。只有我們自己靈活一點,手動判斷DbConnection的類型,並返回相應的DbDataAdapter,雖然比較笨,但是勉強能達到簡化繼承類的目的,代碼如下:

 

        private DbDataAdapter CreateDataAdapter()        {            if (conPrivate is System.Data.SqlClient.SqlConnection)                return new System.Data.SqlClient.SqlDataAdapter();            if (conPrivate is Sybase.Data.AseClient.AseConnection)                return new Sybase.Data.AseClient.AseDataAdapter();            if (conPrivate is MySql.Data.MySqlClient.MySqlConnection)                return new MySql.Data.MySqlClient.MySqlDataAdapter();            throw new NotImplementedException();        }

 

其中 conPrivate 是 DbConnection

 

2。換一個角度,發現DataTable有個Load方法可以使用IDataReader來擷取資料,而IDataReader可以使用DbCommand建立,不會出現DbDataAdapter無法執行個體化的問題。這樣便可在基類實現擷取資料的方法。

 

需要注意的是,直接使用DataTable.Load(IDataReader dr)來擷取資料的話,會帶上各種限制(不可為空,自增列,唯讀列等),在代碼中會很不方便。

 

不過我們知道,Fill方法內部,也是通過DbDataReader來實現填充資料的,為何同樣是用DbDataReader,Fill方法出來的DataTable就沒有任何限制呢?

 

 使用Reflector對Fill方法進行查看,發現使用以下代碼即可,既能在基類中就實現擷取資料的方法,並且不會帶上Constraints

 

                    IDbCommand com = conPrivate.CreateCommand();                    IDataReader dr = com.ExecuteReader();                    DataSet ds = new DataSet();                    DataTable dt = new DataTable();                    ds.Tables.Add(dt);                    ds.Load(dr, LoadOption.OverwriteChanges, dt);                    ds.EnforceConstraints = false;                    return dt;

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.