PDA

View Full Version : مشکل در استفاده از ExecuteReader



emad_67
چهارشنبه 28 فروردین 1387, 21:29 عصر
سلام
من یه سری فیلد ها رو از دیتابیس میخونم و میخوام اونو را در gridview نشون بدم. میخوام در حالی که فیلد ها در حال bind شدن در gridview هستند مجددا فیلد های دیگه ای رو بخونم و در girdview قرار بدم( توسط connection فعلی)
حالا مشکلم اینه که وقتی میخوام اطلاعات رو در حین بایند شدن فیلد ها بخونم همش این ارور رو میده:

There is already an open DataReader associated with this Command which must be closed first

اطلاعات توسط متد ExecuteReader در یک data reader قرار داده میشه ولی من با اینکه در متد RowDataBind شیء جدیدی کلاس SqlCommand ساختم ولی بازم میگه که قبلا یه data reader به اون نسبت داده شده.
اینم کدی هست که نوشتم:


public partial class _Default : System.Web.UI.Page
{
SqlConnection conn;
protected void Page_Load(object sender, EventArgs e)
{
SqlCommand command = new SqlCommand();
SqlDataReader OrderReader;
conn = new SqlConnection();
conn.ConnectionString=ConfigurationManager.Connect ionStrings["NORTHWND"].ConnectionString;
command.Connection = conn;
command.CommandText =
"SELECT Top 50 Customers.CompanyName, Orders.OrderDate " +
"FROM Orders, Customers " +
"WHERE Orders.CustomerID=Customers.CustomerID ";

command.CommandType = CommandType.Text;
command.Connection.Open();
OrderReader = command.ExecuteReader();
GridView1.DataSource = OrderReader;
GridView1.DataBind();
conn.Close();
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
SqlCommand Comm = new SqlCommand();
SqlDataReader OrderDetailReader;
Comm.CommandText =
"SELECT Products.ProductName,[Order Details].UnitPrice " +
"FROM Products,[Order Details] " +
"WHERE [Order Details].ProductID=Products.ProductID";

Comm.CommandType = CommandType.Text;
Comm.Connection = conn;
OrderDetailReader = Comm.ExecuteReader();
}
}
مشکل اصلی در همون خطی هست که قرمز کردم.
خواهشا کمک کنید
ممنون

eAmin
چهارشنبه 28 فروردین 1387, 22:30 عصر
سلام.

به نظر من فکر کنم باید یه کانکشن دیگه بسازی، چون تابع Page_load با تابع بعدی فرق می کنه و فقط توی تابع خودش کار می کنه.

emad_67
چهارشنبه 28 فروردین 1387, 22:34 عصر
به نظر من فکر کنم باید یه کانکشن دیگه بسازی، چون تابع Page_load با تابع بعدی فرق می کنه و فقط توی تابع خودش کار می کنه.رفرنس مربوط به کانکشن رو به صورت global و در ابتدای کلاس تعریف کردم و فقط توی تابع load تخصیص حافظه صورت میگیره. بنابراین از نظر کانکشن مشکلی نیست.

Pioneers
پنج شنبه 29 فروردین 1387, 00:43 صبح
اگه درست فهمیده باشم شما مثلا میخوای لیست کالاها رو نشون بدی و ضمن نشون دادن، مثلا تعداد موجود رو هم بدست بیاری و نشون بدی(یه چیزی شبیه این). در اینصورت کوئری اول رو با یه تابع که تعداد موجودیها رو مشخص میکنه، میکس کنید. نیازی به 2 تا کانکشن هم نیست.

emad_67
پنج شنبه 29 فروردین 1387, 01:40 صبح
اگه درست فهمیده باشم شما مثلا میخوای لیست کالاها رو نشون بدی و ضمن نشون دادن، مثلا تعداد موجود رو هم بدست بیاری و نشون بدی(یه چیزی شبیه این). در اینصورت کوئری اول رو با یه تابع که تعداد موجودیها رو مشخص میکنه، میکس کنید.بله تقریبا یه همین کاری میخوام انجام بدم .ولی درست نفهمیدم که چه جوری باید تابع رو میکس کنم. میشه یه مثال بزنی؟

توی این مثال قرار یه سری فیلد ها از دیتابیس خونده بشه و در حالی که فیلد ها در حال بایند شدن به griview هستند از طریق کانکشن فعلی یه سری اطلاعات دیگه از یه تیبل دیگه هم خونده بشه و در gridview قرار بگیره. حالا میخوام بدونم علت این ارور چیه اصلا؟

el_abdollahi
پنج شنبه 29 فروردین 1387, 10:54 صبح
منظورشون اینه که یه کوئری بنویسی که همه اطلاعات موردنیازت رو باهم بدست بیاری و نیازی به 2 تا کوئری نداشته باشی . در ضمن میتونی به جای استفاده از دیتا ریدر از دیتاست استفاده کنی . اینجوری دیگه مشکل این خطا رو نداری.
موفق باشید .

emad_67
پنج شنبه 29 فروردین 1387, 20:17 عصر
در ضمن میتونی به جای استفاده از دیتا ریدر از دیتاست استفاده کنی . اینجوری دیگه مشکل این خطا رو نداری.
با dataset هم همین مشکل هست.
علتش رو خودم پیدا کردم. چون از MARS(Multiple Active Result Set) استفاده کرده بودم باید توی connectionstring این قسمت رو می نوشتم:


MultipleActiveResultSets=true

به خاطر اینکه این قسمت رو ننوشته بودم، sql server اجازه اجرای دو تا Command رو از یک کانکشن نمیداد.

e-shahshahani
جمعه 30 فروردین 1387, 15:29 عصر
منظورشون اینه که یه کوئری بنویسی که همه اطلاعات موردنیازت رو باهم بدست بیاری و نیازی به 2 تا کوئری نداشته باشی .

به نظر من بهترین راه حل، از نظر سرعت و سهولت همینه گفته شد

Pioneers
جمعه 30 فروردین 1387, 22:45 عصر
select name, id, F_Count(id) from goods
که F_Count تابعیست که id کالا رو میگیره و تعداد موجود رو میده. نحوه نوشتن تابه هم در Books Online هست.