PDA

View Full Version : چرا DataReader هميشه Close است ؟



merlin_vista
یک شنبه 24 شهریور 1387, 17:19 عصر
سلام .

به اين كدها دقت كنيد

DAL :


public SqlDataReader Search_User(string code)
{
SqlCommand cmd_search = new SqlCommand("select_search_user", con);
cmd_search.CommandType = CommandType.StoredProcedure;
cmd_search.Parameters.AddWithValue("@f_code", code);
con_Open();
SqlDataReader Reyder = cmd_search.ExecuteReader();
Con_Closed();
return Reyder;
}

BLL :

public SqlDataReader Serarch_User(string code)
{
return Obj_Dal.Search_User(code);

}

View :

protected void Button1_Click(object sender, EventArgs e)
{
SqlDataReader reyder = obj_bll.Serarch_User(this.txt_Code.Text);

if (reyder.Read())
{

this.lbl_name.Text = reyder.GetValue(1).ToString();
this.lbl_famil.Text = reyder.GetValue(2).ToString();
this.lbl_tel.Text = reyder.GetValue(3).ToString();
this.lbl_email.Text = reyder.GetValue(4).ToString();
this.lbl_address.Text = reyder.GetValue(5).ToString();
this.lbl_date.Text = reyder.GetValue(6).ToString();
this.lbl_time.Text = reyder.GetValue(7).ToString();
this.lbl_code.Text = reyder.GetValue(8).ToString();
if (reyder.GetBoolean(9))
{
this.lbl_state.Text = "اين كاربر تاييد شده است";
}
else
{
this.lbl_state.Text = "اين كاربر تاييد نشده است";
}

}
reyder.Close();
}

ولي اين خطا را ميگيره .

Invalid attempt to call Read when reader is closed.

Rambod
یک شنبه 24 شهریور 1387, 18:06 عصر
شما از DataReader استفاده كرديد. همونطور كه احتمالاً ميدونيد، DataReader اتصال‌گراست (Connection Oriented) پس شما تا وقتي كار خوندنتون تموم نشده نبايد Connection رو ببنديد در حالي كه شما Connection رو قبل از اينكه از DataReader استفاده كنيد، بستيد.

amirniknam
یک شنبه 24 شهریور 1387, 19:59 عصر
در ادامه توضيحات رامبد عزيز اين رو هم اضافه كنم كه DataReader به صورت استاتيك هست و شما با هر كانكشن تنها يك DataReader داريد.

Rambod
یک شنبه 24 شهریور 1387, 20:08 عصر
در ادامه توضيحات رامبد عزيز اين رو هم اضافه كنم كه DataReader به صورت استاتيك هست و شما با هر كانكشن تنها يك DataReader داريد.

البته در SQL Server 2005 به بعد با استفاده از خاصيت Multiple Active Result Set ميشه با يك كانكشن، چند تا DataReader هم داشت.

علیرضا مداح
یک شنبه 24 شهریور 1387, 20:15 عصر
سلام دوست عزیز،
اشیائی که اینترفیس IDataReader را Implement میکنند دارای چند ویژگی هستنذ :
1)Connected
2)Forward-Only
2)Read-Only
4)در هر زمان حاوی "یک" رکورد خواهند بود،
5)با فراخوانی متد Read ، این شیء به سطر بعدی از دیتابیس میرود،
در نتیجه هنگامیکه اتصال این شیء با دیتابیس قطع شود ، با Exception فوق مواجه خواهید شد ، این شیء بر خلاف شیء DataSet به صورت مدل Connected عمل میکند ،

merlin_vista
یک شنبه 24 شهریور 1387, 23:17 عصر
حالا براي رفع اين مشكل چه كنم ؟

Rambod
یک شنبه 24 شهریور 1387, 23:55 عصر
خيلي واضحه! دستور Con_Closed رو بعد از اتمام خوندن از DataReader فراخواني كنيد و نه قبلش!

merlin_vista
دوشنبه 25 شهریور 1387, 00:08 صبح
ممنون مشكل حل شد . از همه دوستان سپاس گزارم

و همچنين اطلاعات خوبي دربازه DataReyder گرفتم .

Behrouz_Rad
سه شنبه 26 شهریور 1387, 00:33 صبح
برای استفاده از DataReader در معماری 3 لایه باید به شکل ذیل عمل کرد.
DataReader در مجموعه ی ADO.NET شی ای از نوع Connected هست. یعنی نیاز به Connection فعال داره.
متد ExecuteReader که برای ایجاد DataReader استفاده میشه در یکی از Overload های خودش اجازه میده تا از مقدار Enum ای با نام CloseConnection استفاده بشه که موجب میشه بعد از بستن DataReader توسط فراخواننده ی DataReader، کانکشن به طور خودکار بسته بشه.

تابع:


public SqlDataReader GetInfo(int CustomerID)
{
//…
return myCommand.ExecuteReader(CommandBehavior.CloseConne ction);
}

نحوه ی فراخوانی:


SqlDataReader myReader = GetInfo(1234);
//… read some data
myReader.Close();

موفق باشید.

hossein2007
یک شنبه 21 مهر 1387, 23:34 عصر
با سلام.
اولا از آقای بهروز راد تشکر می کنم که مثل همیشه جواب هاش باعث بالا رفتن اطلاعات من و بقیه شده.
البته تو این بحث 3 سوال دارم:


1)چرا اصولا نمیشه شی datareader رو به عنوان پارامتر به لایه DAL داد.تا پر بشه و از اون استفاده کنیم و با error مواجه میشم(ولی من با dataset به راحتی این کار رو انجام میدم)
کد مورد استفاده :



SqlDataReader dr;
m.select_madrakno(ref dr);

خطای دریافتی :

Use of unassigned local variable 'dr'


2)ویژگی اتصال گرای datareader در چه مواردی (از لحاظ تعداد رکورد و تعداد کاربر سایت) دردسر ساز است . که dataset برتری داشته باشه.

3)در نهایت توی یه تاپیک (با عنوان تفاوت بین IDbConnection و SqlConnection) گفته بودید
اگر کیلویی برنامه مینویسی از DataReader استفاده کن. آیا هنوز همین نظر رو دارید؟

Behrouz_Rad
یک شنبه 21 مهر 1387, 23:43 عصر
1)چرا اصولا نمیشه شی datareader رو به عنوان پارامتر به لایه DAL داد.تا پر بشه و از اون استفاده کنیم و با error مواجه میشم(ولی من با dataset به راحتی این کار رو انجام میدم)

در پست قبلی در مورد نحوه ی استفاده ی صحیح از DataReader در معماری سه لایه صحبت کردم.


2)ویژگی اتصال گرای datareader در چه مواردی (از لحاظ تعداد رکورد و تعداد کاربر سایت) دردسر ساز است . که dataset برتری داشته باشه

DataSet اصولاً در برنامه های وب، کاربرد بسیار کمی داره. شاید هم اصلاً کاربردی نداشته باشه! ساختار وب ایجاب می کنه که شما نیاز به DataSet نداشته باشید.
DataReader همیشه برای بازیابی داده ها خوبه.


3)در نهایت توی یه تاپیک (با عنوان تفاوت بین IDbConnection و SqlConnection) گفته بودید
نقل قول:
اگر کیلویی برنامه مینویسی از DataReader استفاده کن.
آیا هنوز همین نظر رو دارید؟

لطف بفرمایید لینک اون تاپیک رو بدید.

موفق باشید.

hossein2007
دوشنبه 22 مهر 1387, 14:20 عصر
http://barnamenevis.org/forum/showthread.php?t=92344&highlight=%D8%AA%D9%81%D8%A7%D9%88%D8%AA+%D8%A8%DB %8C%D9%86+IDbConnection+SqlConnection

با تشكر.

Behrouz_Rad
دوشنبه 22 مهر 1387, 15:01 عصر
پاسخ من مختص اون دوستمون بود که برای پر کردن ComboBox پرسیده بودن. و البته مختص Win Apps! بخش رو اشتباه گرفتم!
ComboBox در Win Apps فقط Bind به منابع داده ای رو پشتیبانی می کنه که اینترفیس IList رو پیاده سازی کرده باشند. DataReader فقط اینترفیس IEnumerable رو پیاده سازی می کنه. در نتیجه نمیشه DataReader رو به ComboBox بایند کنی. DataSet، DataTable، ArrayList و چند منبع داده دیگه هستند که اینترفیس IList رو پیاده سازی می کنند.

موفق باشید.

hossein2007
دوشنبه 22 مهر 1387, 19:32 عصر
متشکر و ممنون .

m.hamidreza
سه شنبه 23 مهر 1387, 00:00 صبح
پاسخ من مختص اون دوستمون بود که برای پر کردن ComboBox پرسیده بودن. و البته مختص Win Apps! بخش رو اشتباه گرفتم!

مهندس جان این قسمت هم مختص اون دوستمون بوده:


اگر لایه ای کار می کنی از Disconnected Object باید استفاده کنی. مثل Dataset

Behrouz_Rad
سه شنبه 23 مهر 1387, 00:34 صبح
در Win Apps بله. DataSet کاربردش در برنامه های Desktop هست.

موفق باشید.