View Full Version : سوال: نحوه پاک کردن یک رکورد از gridview در حالی که آن جدول به چند جدول دیگر متصل است
dontspeak
دوشنبه 02 خرداد 1390, 11:52 صبح
سلام. من می خوام یکی از رکوردهای گرید ویو رو حذف کنم. منتها اون رکورد توی جدولیه که با چند تا جدول دیگه رابطه داره. enable deleting رو انتخاب کردم ولی موقع delete کردن ارور میده. اینم ارورشه
The DELETE statement conflicted with the REFERENCE constraint "FK_ThankTable_PostTable". The conflict occurred in database "allTest", table "dbo.ThankTable", column 'fkPostId'.
The statement has been terminated.
فکر میکنم باید پروسیجر بنویسم ولی نمیدونم چه کدی بنویسم. سرچم کردم ولی چیزی دستگیرم نشد
یوسف زالی
دوشنبه 02 خرداد 1390, 11:56 صبح
سلام.
شما باید اول تمام اطلاعات متصل به این رکورد رو در جداول دیگه پیدا کرده و پاک کنید.
این کار هم باید با Transaction صورت بگیره.
dontspeak
دوشنبه 02 خرداد 1390, 13:03 عصر
از جوابتون ممنون سرچ کردم و یه سری مطلب گیر آوردم ولی چون اصلا از Transaction استفاده نکردم نمی دونم دقیقا باید چکار کنم مثلا اینجا (http://stackoverflow.com/questions/783726/how-do-i-delete-from-multiple-tables-using-inner-join-in-sql-server) گفت از این کد استفاده کن
begin transaction;
declare @deletedIds table ( id int );
delete t1
output deleted.id into @deletedIds;
from table1 t1
join table2 t2
on t2.id = t1.id
join table3 t3
on t3.id = t2.id;
delete t2
from table2 t2
join @deletedIds d
on d.id = t2.id;
delete t3
from table3 t3 ...
commit transaction;
ولی اصلا نمی دونم کجا باید ازش استفاده کنم یا اینکه بعدش چکار کنم میشه یکم در مورد نحوه استفاده از Transaction توضیح بدید؟ الان میدونم که Transaction برای اینه که یه سری دستور رو اجرا کنی و اگه به درستی پیش رفت اون تغییرات اعمال بشه و اگه نه به حالت اول برگرده.
یوسف زالی
دوشنبه 02 خرداد 1390, 13:37 عصر
transaction واسه مواقعی هست که چند تا کار یا همش باهم باید انجام شه یا هیچ کدوم.
در این مورد اگه یکی از جداولت وقت پاک شدن ارور داد اونایی که پاک شده رو برمیگردونه.
dontspeak
دوشنبه 02 خرداد 1390, 13:49 عصر
transaction واسه مواقعی هست که چند تا کار یا همش باهم باید انجام شه یا هیچ کدوم.
در این مورد اگه یکی از جداولت وقت پاک شدن ارور داد اونایی که پاک شده رو برمیگردونه.
میشه در مورد نحوه استفاده از transaction یکم توضیح بدید؟ من یه سری کد پیدا کردم ولی همونطور که گفتم چون تابحال از transaction استفاده نکردم نحوه بکارگیری اون کدها رو بلد نیستم
یوسف زالی
دوشنبه 02 خرداد 1390, 14:14 عصر
begin transaction
کارهای شما
if @@ERROR <> 0
rollback
commit
end transaction
dontspeak
دوشنبه 02 خرداد 1390, 14:34 عصر
خوب این کدو کجا باید بنویسم؟ توی code-behind? توی پروسیجر یا جای دیگه؟ میشه یه نمونه کد هم بزارید؟
ببینید مثلا اونجایی که نوشتید کارهای شما مثلا من باید بنویسم
delet*from table1
delete from table2
درسته دیگه؟
dontspeak
دوشنبه 02 خرداد 1390, 14:40 عصر
اینم یه نمونه کد
protected void Button1_Click(object sender, EventArgs e)
{ SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;uid=sa;pwd=sa;");
myConnection.Open();
// Start a local transaction
SqlTransaction myTrans = myConnection.BeginTransaction();
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;
try
{ myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "delete * from Region where RegionID=101";
// Attempt to commit the transaction.
myCommand.ExecuteNonQuery();
myTrans.Commit();
Response.Write("Both records are written to database.");
}
catch (Exception ep)
{ // Attempt to roll back the transaction.
myTrans.Rollback();
Response.Write(ep.ToString());
Response.Write("Neither record was written to database.");
}
finally
{ myConnection.Close();
}
}
خوب حالا من اینجا باید دستورات delete خودمو بنویسم درسته؟ الان باید یه sqlcomment بنویسم واسه پاک کردن از جدول 1 و یکی دیگه هم بنویسم واسه پاک کردن از جدول دو؟ یه چیزایی شبیه کد زیر؟
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection myConnection = new SqlConnection(@"Data Source=.\sqlexpress;initial catalog = allTest;integrated Security=true");
myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction();
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "delete * from table1 where id=4";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "delete * from table2 where id=4";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Response.Write("Both records are written to database.");
}
catch (Exception ep)
{
myTrans.Rollback();
Response.Write(ep.ToString());
Response.Write("Neither record was written to database.");
}
finally
{
myConnection.Close();
}
}
یوسف زالی
دوشنبه 02 خرداد 1390, 14:54 عصر
کدهارو تو storded proc بذار.
delete هارو هم جای کارهای شما.
بعد از هر delete اون if رو بذار.
آخرش هم commit.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.