PDA

View Full Version : سوال: Concurrency violation: the DeleteCommand affected 0 of the expected 1 records.



rahil_2008
دوشنبه 23 خرداد 1390, 01:51 صبح
سلام دوستان
من این کدو نوشتم :


da = new SqlDataAdapter("select * from Items", cnn);
da.Fill(ds);

SqlCommandBuilder cmb = new SqlCommandBuilder(da);
da.DeleteCommand = cmb.GetDeleteCommand();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
ds.Tables[0].Rows[0].Delete();
cnn.Open();
da.Update(ds);
cnn.Close();

و با این پیام خطا مواجه شدم:

Concurrency violation: the DeleteCommand affected 0 of the expected 1 records.
لطفا راهنمایی کنید

bazardeh
دوشنبه 23 خرداد 1390, 10:33 صبح
کد کامل رو بزار
مظورت از این کد چیه و چه جوابی ازش بگیری
به نظرم منظورش از این خطا اجرا شدن همزمان اجرا 2 دستور باشه

rahil_2008
دوشنبه 23 خرداد 1390, 12:04 عصر
سلام دوست عزیز
من این کدو برای این نوشتم که کل ردیف های جدولم را در دیتابیس پاک کنم(تا بعدش بتونم کل ردیف ها رو دوباره از گرید بریزم تو دیتابیس)
(البته اگر شما راه بهتری هم برای ریختن کل ردیفهای گرید بطور مجدد از دیتاست به دیتابیس سراغ دارین بگین.من تنها راهی که به ذهنم رسید این بود)

bazardeh
دوشنبه 23 خرداد 1390, 12:29 عصر
مثلا اگر جدول شما 3 فیلد دارید و اگر فرض ،اولیش ردیف است، ردیف رو یرای دیتا گرید انتخاب نکن
مثل زیر


da = newSqlDataAdapter("select student,tell from Items", cnn);

rahil_2008
دوشنبه 23 خرداد 1390, 20:09 عصر
حالا با این خطا مواجه می شم:

Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.
که مربوط به این خط از کد می شه:


da.DeleteCommand = cmb.GetDeleteCommand();
:متفکر:

اجازه بدید سوالمو اینجوری بگم: باتوجه به اینکه ممکنه چندین سطر در دیتاگرید اضافه یا تغییریافته باشه،باید وقتی کاربر روی دکمه درج کلیک می کنه کل گرید مجددا در دیتابیس بارگذاری بشه، به همین دلیل من می خوام که یه بار کل ردیف های جدول دیتابیسم را حذف کنم و بعد دوباره توش مقادیر را از گرید بارگذاری کنم
کل کدی هم که تو رویداد کلیک دکمه درجم نوشتم به این صورته:


SqlConnection cnn = newSqlConnection("Data Source=.;Initial Catalog=ItemsInStocks;Integrated Security=True");
SqlDataAdapter da;
DataSet ds;
ds = newDataSet();
da = newSqlDataAdapter("select ItemCode from Items", cnn);
da.Fill(ds);
SqlCommandBuilder cmb = newSqlCommandBuilder(da);
da.DeleteCommand = cmb.GetDeleteCommand();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
ds.Tables[0].Rows[0].Delete();
cnn.Open();
da.Update(ds);
cnn.Close();
da.InsertCommand = cmb.GetInsertCommand();
DataRow dr = ds.Tables[0].NewRow();
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
DataRow dr = ds.Tables[0].NewRow();
dr["ItemCode"] = dataGridView1.Rows[i].Cells[0].Value.ToString();
dr["ItemName"] = dataGridView1.Rows[i].Cells[1].Value.ToString();
dr["AUnit"] = dataGridView1.Rows[i].Cells[2].Value.ToString();
dr["FUnit"] = dataGridView1.Rows[i].Cells[3].Value.ToString();
}
cnn.Open();
da.Update(ds);
cnn.Close();

لطفا راهنمایی کنید و اگه راه بهتری سراغ دارید بگید

rahil_2008
سه شنبه 24 خرداد 1390, 12:03 عصر
تو رو خدا یکی جواب بده من فردا باید اینو تحویل بدم:افسرده:

bazardeh
سه شنبه 24 خرداد 1390, 12:52 عصر
قضیه رو خیلی پیچوندی
کد های انتخاب و درج و حذف و آپدیت در زیر است فقط ببخشد وقت نکردم با کد هات میزون کنم فقط جای school در SqlConnection نام پایگاه داده خورتو یزار
برای select کردن


SqlConnection con = new SqlConnection("server=(local);database=School;integrated security=true;");
dataGridView1.DataBindings.Clear();
SqlDataAdapter da = new SqlDataAdapter("select * from lesson order by namles", con);
DataSet set = new DataSet();
da.Fill(set, "lesson");
dataGridView1.DataBindings.Add("datasource", set, "lesson");
dataGridView1.Columns[0].HeaderText = "کد درس";
dataGridView1.Columns[1].HeaderText = "نام معلم";
dataGridView1.Columns[2].HeaderText = "نام درس";
dataGridView1.Columns[3].HeaderText = "ساعت ارائه";
dataGridView1.Columns[4].HeaderText = "توضیحات";
con.Close();


برای درج


SqlConnection con = new SqlConnection("server=(local);database=School;integrated security=true;");
SqlCommand cm = new SqlCommand("insert into lesson(codles,nametea,namles,timeles,other)values( @1,@2,@3,@4,@5)");
cm.Connection = con;
cm.Parameters.Clear();
cm.Parameters.AddWithValue("@1", textBox2.Text);
cm.Parameters.AddWithValue("@2", comboBox1.Text);
cm.Parameters.AddWithValue("@3", textBox4.Text);
cm.Parameters.AddWithValue("@4", textBox3.Text);
cm.Parameters.AddWithValue("@5", textBox5.Text);
cm.ExecuteNonQuery();
MessageBox.Show("مشخصات درس جدید با موفقیت ثبت شد", "پیغام", MessageBoxButtons.OK, MessageBoxIcon.Information);

con.Close();

برای حذف


SqlConnection con = new SqlConnection("server=(local);database=School;integrated security=true;");
SqlCommand cm = new SqlCommand("Delete from lesson where codles=@codles");
cm.Connection = con;
cm.Parameters.Clear();
cm.Parameters.AddWithValue("@codles", System.Convert.ToInt32(textBox2.Text));
cm.ExecuteNonQuery();

MessageBox.Show("درس مورد نظر با موفقیت حذف شد", "پیغام", MessageBoxButtons.OK, MessageBoxIcon.Information);

con.Close();

برای آپدیت


SqlConnection con = new SqlConnection("server=(local);database=School;integrated security=true;");
SqlCommand cm = new SqlCommand("update lesson set codles=@1 , nametea=@2 , namles=@3, timeles=@4, other=@5 where codles= '" + dataGridView1.CurrentRow.Cells[0].Value.ToString() + "'", con);
cm.Connection = con;
cm.Parameters.AddWithValue("@1", textBox2.Text);
cm.Parameters.AddWithValue("@2", comboBox1.Text);
cm.Parameters.AddWithValue("@3", textBox4.Text);
cm.Parameters.AddWithValue("@4", textBox3.Text);
cm.Parameters.AddWithValue("@5", textBox5.Text);
cm.ExecuteNonQuery();
MessageBox.Show("مشخصات درس مورد نظر با موفقیت ثبت شد", "پیغام", MessageBoxButtons.OK, MessageBoxIcon.Information);
con.Close();

bazardeh
سه شنبه 24 خرداد 1390, 14:18 عصر
برای پنهان کردن ردیف از دید کاربر در دیتا گرید


dataGridView1.Columns[0].Visible = false;

rahil_2008
سه شنبه 24 خرداد 1390, 19:01 عصر
از توجهتون خیلی ممنونم
اما نم دونم چرا این کد:

dataGridView1.DataBindings.Clear();
که برای پاک کردن دیتاگرید هست را وقتی می نویسم چیزی از دیتاگریدم پاک نمی شه!(که البته منطقا باید کل ردیف های گریدم پاک بشه)

rahil_2008
سه شنبه 24 خرداد 1390, 19:20 عصر
حل شد یه دنیا ممنون