PDA

View Full Version : سوال: مشکل با SqlDataReader



m.bibjan
پنج شنبه 24 فروردین 1391, 23:27 عصر
سلام من برای اینکه اطلاعاتم رو از جدول بریزم توی تکس باکس ها ازین کد استفاده کردم ( همون عملیات سرچ)

private void btnsearch_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = @" server = (local) ; database=tester; integrated security = true";
conn.Open();
SqlDataAdapter db = new SqlDataAdapter("", conn);
db.SelectCommand.CommandText = "Select * From test1 where name = '" + txtname.Text + "' ";
DataSet ds = new DataSet();


SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = " SELECT name,family,picture from test1 where name=@name";
cmd.Parameters.AddWithValue("@name", txtname.Text.Trim());
SqlDataReader re;
re = cmd.ExecuteReader();
if (re.Read())
{
byte[] Pic;
MemoryStream MS;
Pic = (byte[])re.GetValue(2);
MS = new MemoryStream();
MS.Write(Pic, 0, Pic.Length);
picboxinfo.BackgroundImage = Image.FromStream(MS);
re.Close();
db.Fill(ds, "test1");
DataRow dr = ds.Tables["test1"].Rows[0];
txtname.Text = dr[1].ToString();
txtfamily.Text = dr[2].ToString();

این ارور رو بهم میده.
There is already an open DataReader associated with this Command which must be closed first.



فروم های خارجی هم میگن که DataReader رو Close کن تا درست بشه.اینکار رو هم کردم ولی درست نشد.والبته توی جستجوی توی این سایت هم دوستی گفته بودند Dispose کن . این کار رو هم کردم نشد و همون خطا رو میده دوباره.

ممنون اگه راهنمایی کنید.

سوداگر
پنج شنبه 24 فروردین 1391, 23:47 عصر
یه جایی (http://stackoverflow.com/questions/6062192/there-is-already-an-open-datareader-associated-with-this-command-which-must-be-c) گفته بود (http://stackoverflow.com/questions/4867602/entity-framework-there-is-already-an-open-datareader-associated-with-this-comma) که توی کانکشن استرینگ این رو اضافه کن: MultipleActiveResultSets=true
فکر کنم به خاطر اینه که به کانکشن اجازه بده چندتا Query روش اجرا بشه.

m.bibjan
جمعه 25 فروردین 1391, 00:01 صبح
ممنون ولی نشد
راه دیگه ای هم هست؟

omid_csh
جمعه 25 فروردین 1391, 00:47 صبح
سلام
نمیدونم چرا برای این کار دو تا query نوشتید؟هر دو تا query که از یه جدول هستش و فقط با سطر اول مجموعه نتیجه کار داری؟
فکر کنم اگه بعد از بستن dataReader کانکشن رو هم ببندی درست شه. متد fill هم که خودش کانکشن رو باز میکنه و می بنده.

m.bibjan
جمعه 25 فروردین 1391, 01:02 صبح
ممنون اگه بخوام یکی از کوئریها رو حذف کنم چه تغییری توی کد باید داده بشه؟

omid_csh
جمعه 25 فروردین 1391, 01:12 صبح
ممنون اگه بخوام یکی از کوئریها رو حذف کنم چه تغییری توی کد باید داده بشه؟
کوئری اول (DataSet) رو حذف کن و از همون dataReader استفاده کن.
SqlConnection conn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataReader re;

conn.ConnectionString = @" server = (local) ; database=tester; integrated security = true";

cmd.Connection = conn;
cmd.CommandText = " SELECT name,family,picture from test1 where name=@name";

cmd.Parameters.AddWithValue("@name", txtname.Text.Trim());

conn.Open();

re = cmd.ExecuteReader();

if (re.Read())
{
byte[] Pic;
MemoryStream MS;
Pic = (byte[])re.GetValue(2);
MS = new MemoryStream();
MS.Write(Pic, 0, Pic.Length);
picboxinfo.BackgroundImage = Image.FromStream(MS);

txtname.Text = re.GetString(0);
txtfamily.Text = re.GetString(0);
}

re.Close();
conn.Open();

m.bibjan
جمعه 25 فروردین 1391, 01:30 صبح
ممنون کار شما رو هم انجام دادم ولی نشد.
همون ارور رو هم داد دوباره.
چیکار میشه کرد به نظرتون.

m.bibjan
جمعه 25 فروردین 1391, 14:33 عصر
سلام کسی نیست این مشکل رو حل کنه؟خیلی گیر افتادم.

va2012
جمعه 25 فروردین 1391, 14:47 عصر
سلام کسی نیست این مشکل رو حل کنه؟خیلی گیر افتادم.

دوست عزیز من برای خواندن اطلاعات از dataRedader استفاده کردم . ولی این مشکل رو ندیدم.

ظاهر متن این Error اشاره به این داره که شما احتمالا باید کانکشنی که باز شده رو بعد از اجرای کد مربوط به dataReader ببندید.

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

کد من در حالت خیلی ساده این شکلیه : ( کانکشن قبلا باز شده)

OleDbDataReader reader1 = new OleDbCommand("select * from Table1", connection).ExecuteReader();

while (reader1.Read())
{
textBox1.Text = Convert.ToString(reader1[1]);

command.CommandText = "insert into Table (1,2,3,4,5,6) values ('" + Convert.ToString(reader1[0]) + "','" + Convert.ToString(reader1[1]) + "','" + Convert.ToString(reader1[2]) + "','" + Convert.ToString(reader1[3]) + "','" + txt1.Text + "','" + txt2.Text + "')";
command.Connection = connection;
command.ExecuteNonQuery();

Form6_Load(null, null);

progressBar1.Value = progressBar1.Value + 1;

}

connection.Close();

حالا شما بعد از کد dataReader کد بستن کانکشن رو اضافه کن ببین درست میشه یا نه؟

m.bibjan
جمعه 25 فروردین 1391, 15:04 عصر
ممنوندرست شد.
فقط یه بحثی که میمونه اینه که علت ارور بالا استاندارد و اصولی نبودنه کده یا کامل نبودن کد؟
اصولی نبودنه کده = کد ها کامل هستند ولی اصولی نیستند
کامل نبودن کد = مثل ننوشتن قسمتی از کد

va2012
جمعه 25 فروردین 1391, 15:20 عصر
ممنوندرست شد.
فقط یه بحثی که میمونه اینه که علت ارور بالا استاندارد و اصولی نبودنه کده یا کامل نبودن کد؟
اصولی نبودنه کده = کد ها کامل هستند ولی اصولی نیستند
کامل نبودن کد = مثل ننوشتن قسمتی از کد

خوب به خاطر کامل نبودن کد هست چون شما ابتدا برای خواندن داده ها باید ارتباط با دیتابیس رو از طریق ()connection.Open برقرار کنید و وقتی اطلاعات توسط dataReader به صورت کامل خونده شد باید دوباره ارتباط رو با دستور ()connection.Close ببندید تا کد کامل بشه.