如何從SqlDataReader中獲取DataRow


1、前言
使用SqlDataReader較之SqlDataAdapter速度上快,因為讀取記錄是一行一行的來,但是往往也感覺那么蹩腳。例如經常用到的如何從SqlDataReader中獲取DataRow呢?下面給出以下幾種方法。

2、DataSet.Load方法
首先使用DataSet.Load(pSqlDataReader, LoadOption.Upsert, "")將數據載入。再使用pDataSet.Tables[0].Rows[0]取出說要的DataRow值,如下:
       private DataRow GetDataRow(SqlDataReader pSqlDataReader)
        {
            DataRow pDataRow = null;
            DataSet pDataSet = new DataSet();
            DataTable pDataTable = m_DataRow.Table.Clone();
            pDataSet.Load(pSqlDataReader, LoadOption.Upsert, pDataTable.TableName);
            if (pDataSet.Tables[0].Rows.Count != 0)
            {
                pDataRow = pDataSet.Tables[0].Rows[0];
            }
            return pDataRow;
        }
該方法經常會出現數值轉換錯誤:如nvarchar 值 '123456789011' 的轉換溢出了 int 列。超出了最大整數值。需要用戶自己做排錯處理。

3、DataTable.Load方法
方法的原理同上,先使用pDataTable.Load(pSqlDataReader, LoadOption.Upsert, null)將數據裝入DataTable,然后使用pDataTable.Rows[0]獲取DataRow的值。代碼如下:

        private DataRow GetDataRow(SqlDataReader pSqlDataReader)
        {
            DataRow pDataRow = null;
            DataSet pDataSet = new DataSet();
            DataTable pDataTable = m_DataRow.Table.Clone();
            pDataTable.Rows.Clear();
            pDataTable.Load(pSqlDataReader, LoadOption.Upsert, null);
            if (pDataTable.Rows.Count != 0)
            {
                pDataRow = pDataTable.Rows[0];
            }
            return pDataRow;
        }
同樣如果數據不符合則出現上面的錯誤。

4、SqlDataReader.GetValue和DataTable.LoadDataRow方法
首先使用pSqlDataReader.GetValues(Values)將數據輸出到數組Values中,然后通過pDataTable.LoadDataRow(Values, false)將數據裝入DataTable,最后使用pDataRow = pDataTable.Rows[0]取出需要的值。代碼如下:

        private DataRow GetDataRow(SqlDataReader pSqlDataReader)
        {
            DataRow pDataRow = null;
            DataSet pDataSet = new DataSet();
            DataTable pDataTable = m_DataRow.Table.Clone();
            object[] Values = new object[pDataTable.Columns.Count];
            pSqlDataReader.GetValues(Values);
            pDataTable.LoadDataRow(Values, false);
            if (pDataTable.Rows.Count != 0)
            {
                pDataRow = pDataTable.Rows[0];
            }
            return pDataRow;
        }

5、SqlDataReader.GetValues和DataRow.ItemArray = Values方法

該方法使用上面的原理,首先使用pSqlDataReader.GetValues(Values)將數據輸出到數組Values中,然后定義一個DataRow,使用DataRow.ItemArray = Values方法對DataRow進行賦值,代碼如下:

        private DataRow GetDataRow1(SqlDataReader pSqlDataReader)
        {
            DataSet pDataSet = new DataSet();
            DataRow pDataRow = m_DataRow.Table.NewRow();
            object[] Values = new object[m_DataRow.Table.Columns.Count];
            pSqlDataReader.GetValues(Values);
            pDataRow.ItemArray = Values;
            return pDataRow;
        }
注意由於新定義的DataRow沒有字段信息,需要對DataRow的列字段進行定義,定義一個空的符合數據要求的DataRow,使用DataTable.NewRow();,然后就可以使用該方法pDataRow.ItemArray = Values進行賦值。該方法效率高。

6、總結
本文建議使用最后一種方法,效率高且轉換安全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM