تفاوت های DataReader ،DataSet ،DataAdapter ،DataTable در ASP.Net

هدف از ارائه این مقاله نشان دادن تفاوت های موجود بین dataReader , dataSet , dataAdapter و dataTable در#C است و کارایی انها را همراه با آوردن و پیش بردن یک مثال توضیح خواهیم داد تا به یک درک درست از این مفاهیم برسیم .

DataReader

DataReader همانطور که از نامش پیداست، خواننده اطلاعات است . DataReader برای واکشی رکوردها توسط functionها و procedureهای موجود در کوئری های SQL مورد استفاده قرار میگیرد همانند عملگر SELECT .

DataReader سریع ترین تکنیک برای واکشی اطلاعات درون رکورد ها از پایگاه اطلاعات است . مکانیزم موجود در بدین صورت است که در صورت خواندن اطلاعات یک سطر و گذشتن از آن دیگر توانایی بازگشتن و دوباره خواندن آن سطر را ندارد .

dataReader ، فقط خواندنی (ReadOnly) است و در یک زمان و قابلیت واکشی یک سطر را از حافظه دارد و از آن به بعد بارگذاری کمتری روی حافظه دارد .

تابع خواندن DataReader در یک زمان فقط یک سطر را از حافظه می خواند و زمانی که فایل خوانده شد تابع یک مقدار True باز می گرداند در غیر این صورت False را بر میگرداند. DataReader یک اتصال باز (Open Connection) برای اجرای جملات SQL میخواهد .

در مثال زیر هدف ، واکشی اسم شهر برای همه رکوردها در جدول Peson با استفاده از DataReader است .

string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constring))
{
    using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con))
    {
        cmd.CommandType = CommandType.Text;
        con.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            string name = dr["Name"].ToString();
            string city = dr["City"].ToString();
            Response.Write("Name: " + name);
            Response.Write("City: " + city);
        }
        con.Close();
    }
}

DataAdapter

DataAdapter برای اجرای جملات SQL و حاصل کوئری های SQL را درون DtaTable یا DataSet قرار میدهد .
DataAdapter تمام سطرهای SQL که اجرا شدند ان را یکبار بصورت یکجا می آورد و حاصل کوئری های SQL را درون DtaTable یا DataSet قرار میدهد و این را باید در نظر بگیریم که DataAdapter ها نسبت به DataReader ها کمی کندتر هستند .
زمانی که حاصل کوئری های SQL را درون DataTable یا DataSet قرار داد میتواند هم به جلو و هم به عقب روی سطرها پیمایش کند .
DataAdapter برای جاگذاری مقادیر بدست آمده از کوئری ها درون DataSet و DataTable ، از تابع Fill استفاده میکند .
DataAdapter اتصال بین SQL را بصورت داخلی مدیریت میکند و نیازی به باز بسته کردن آن بصورت صریح نیست و این ویژگی با نام Disconnected Architecture شناخته میشود.

در مثال زیر هدف ، واکشی اسم شهر برای همه رکوردها در جدول Peson با استفاده از DataAdapter است .
 

string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constring))
{
    using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con))
    {
        cmd.CommandType = CommandType.Text;
        using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            sda.Fill(ds);
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                string name = row["Name"].ToString();
                string city = row["City"].ToString();
                Response.Write("Name: " + name);
                Response.Write("City: " + city);
            }
        }
    }
}

DataSet 
DataSet ترم های ساده ای برای مقدار دهی است برای مثال ، مقداردهی Datatable یا مجموعه ای از DaTaTable ها . 
در واقع از DataSet برای واکشی اطلاعات یک یا چند DataTable و نگهداری آن در حافظه ، استفاده میکنیم .
DataAdapter برای مقداردهی DataSet با استفاده از مقادیر بازگشتی از جملات SQL ، استفاده میشود و همچنین یک DataSet میتواند در حافظه و جدول ها ساخته شود و اطلاعات میتوانند درون آن قرار بگیرند .

DataSet همچنین میتواند به فایل XML تبدیل و ذخیره گردد . 
در مثال زیر هدف ، واکشی اسم شهر برای همه رکوردها در جدول Peson با استفاده از DataSet است .

string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constring))
{
    using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con))
    {
        cmd.CommandType = CommandType.Text;
        using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            sda.Fill(ds);
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                string name = row["Name"].ToString();
                string city = row["City"].ToString();
                Response.Write("Name: " + name);
                Response.Write("City: " + city);
            }
        }
    }
}

DatTable

DataTable توانایی ذخیره سازی و نگهداری رکوردهای موجود در سطرها و ستون های یک جدول را ، دارد .
​در واقع از DataSet برای واکشی اطلاعات یک  و تنها یک جدول و نگهداری آن در حافظه ، استفاده میکنیم . 
DataAdapter برای مقداردهی DataTable با استفاده از مقادیر بازگشتی از جملات SQL ، استفاده میشود و همچنیم یک DataTable میتواند در حافظه و جدول ها ساخته شود و اطلاعات میتوانند به آن اضافه شوند.
در مثال زیر هدف ، واکشی اسم شهر برای همه رکوردها در جدول Peson با استفاده از DataTable است .

 

string constring = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(constring))
{
    using (SqlCommand cmd = new SqlCommand("SELECT Name, City FROM Persons", con))
    {
        cmd.CommandType = CommandType.Text;
        using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
        {
            DataTable dt = new DataTable();
            sda.Fill(dt);
            foreach (DataRow row in dt.Rows)
            {
                string name = row["Name"].ToString();
                string city = row["City"].ToString();
                Response.Write("Name: " + name);
                Response.Write("City: " + city);
            }
        }
    }
}