تبدیل DataReader به DataTable

چهارشنبه 4 آذر 1394

در این مقاله نحوه تبدیل data reader به datatable را خواهیم آموخت .همان طور که می دانید data reader بهترین روش برای حلقه زدن بر روی دیتاست .

تبدیل DataReader به DataTable

در این مقاله نحوه تبدیل data reader به datatable را خواهیم آموخت .همان طور که می دانید data reader بهترین روش برای حلقه زدن بر روی دیتاست .

از نظر  Performance با کارایی data reader سریعتر از data adapter است .نیاز است که در برخی مواقع data reader را به data table تبدیل کنید .

قبل از شروع بحث کمی راجع به مفاهیم اساسی صحبت خواهیم کرد

DataSet چیست ؟

DataSet در واقع یک بانک اطلاعاتی کوچک در حافظه است .یعنی بر خلاف DataReader که فقط یک رکورد در هر بار دارد می تواند مجموعه ای از جداول را شامل باشد.یک DataSet از مجموعه ای از DataTable تشکیل شده است .بین این DataTable ها مانند جداول درون بانک می تواند ارتباطات مختلفی وجود داشته باشد.

DataReader:جابجایی داده بین بانک اطلاعاتی و یک برنامه .net است .ولی در هر بار فقط یک رکورد لود می شود.و دوباره DataReader به بانک سر می زند و رکورد بعدی را می آورد.

شاید فکر کنید که چرا از data adapter و cell set استفاده نمی کنیم .اگر دیتایی که قصد کار کردن با آن را داریم بزرگ باشد اگر از data adapter و cell set استفاده کنیم سرعت برنامه کند خواهد شد.استفاده از DataReader به مراتب سرعت ما را افزایش خواهد داد.در واقع اگر بخواهیم بر اساس سرعت اولویت بندی انجام دهیم چیزی مانند زیر خواهیم داشت

Data reader >> Data Adapter >> Cell Set

در ادامه کدی آورده شده است که Datareader را به DataTable تبدیل می کند.

#region Convert Datareader toDatatable
       /// <summary>
       /// Convert Datareader toDatatable
       /// </summary>
       /// <param name="query"></param>
       /// <param name="myConnection"></param>
       public DataTable ConvertDataReaderToDataTable(string query, string myConnection)
       {
           AdomdConnection conn = new AdomdConnection(myConnection);
           try
           {
               try
               {
                   conn.Open();
               }
               catch (Exception)
               {
               }
               using (AdomdCommand cmd = new AdomdCommand(query, conn))
               {
                   AdomdDataReader rdr;
                   cmd.CommandTimeout = connectionTimeout;
                   using (AdomdDataAdapter ad = new AdomdDataAdapter(cmd))
                   {
                       DataTable dtData = new DataTable("Data");
                       DataTable dtSchema = new DataTable("Schema");
                       rdr = cmd.ExecuteReader();
                       if (rdr != null)
                       {
                           dtSchema = rdr.GetSchemaTable();
                           foreach (DataRow schemarow in dtSchema.Rows)
                           {
                               dtData.Columns.Add(schemarow.ItemArray[0].ToString(),
                               System.Type.GetType(schemarow.ItemArray[5].ToString()));
                           }
                           while (rdr.Read())
                           {
                               object[] ColArray = new object[rdr.FieldCount];
                               for (int i = 0; i < rdr.FieldCount; i++)
                               {
                                   if (rdr[i] != null) ColArray[i] = rdr[i];
                               }
                               dtData.LoadDataRow(ColArray, true);
                           }
                           rdr.Close();
                       }
                       return dtData;
                   }
               }
           }

           catch (Exception)
           {
               throw;
           }
           finally
           {
               conn.Close(false);
           }
       }
       #endregion;

در زیر دو DataTable ایجاد کرده ایم .

DataTable dtData = new DataTable("Data");
                       DataTable dtSchema = new DataTable("Schema");

اجرای DataReader

برای ساخت schema می توانیم تابع() GetSchemaTable را فراخوانی کنیم .این تابع جزیی از DataReader می باشد.برای استفاده از این تابع باید Microsoft.AnalysisServices.AdomdClient.dll را به پروژه متصل نماییم .

افزودن نام هدر به data table

rdr = cmd.ExecuteReader();

لود کردن دیتا به dtData
برای لود کردن دیتا از تابع LoadDataRow() استفاده می کنیم .این تابع یک پارامتر از جنس Object می گیرد.

foreach (DataRow schemarow in dtSchema.Rows)
                            {
                                dtData.Columns.Add(schemarow.ItemArray[0].ToString(),
                                System.Type.GetType(schemarow.ItemArray[5].ToString()));
                        

کد زیر تبدیل DataReader  به DataTable می باشد.

object[] ColArray = new object[rdr.FieldCount];
                                for (int i = 0; i < rdr.FieldCount; i++)
                                {
                                    if (rdr[i] != null) ColArray[i] = rdr[i];
                                }
                                dtData.LoadDataRow(ColArray, true)

بعد از اجرا خروجی زیر را خواهید دید

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 4 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید