PDA

View Full Version : سوال: حذف اطلاعات از پایگاه داده به وسیله TableAdapter



amin tavakoli
شنبه 25 تیر 1390, 08:43 صبح
سلام دوستان من با کد زیر مشکل دارم مشکلم اینه که با دستور اول سطر مورد نظر رو هم از گرید حذف می کنم هم از دیتا ست . اما این اطلاعات از جدول های پایگاه داده حذف نمیشه و با دستور دوم دوباره اطلاعات قبلی نمایش داده میشه




DataSet1.customer.Rows.Remove(DataSet1.customer[BindingSource1.Position]);


TableAdapter1.Update(DataSet1.customer );

morteza271
شنبه 25 تیر 1390, 08:58 صبح
خوب شما اونا رو فقط از دیتاست حذف کریدن و هنوز از دیتابیس حذف نشده دیگه!
به خاطر همین دوباره میاد.

amin tavakoli
شنبه 25 تیر 1390, 09:20 صبح
دوست عزیز میخوام با کد زیر آنها رو پاک کنم ولی فیلد دوم و سوم توی جدول از نوع long , int هستند بعد از value چی باید بنویسم که از مقدارش ایراد نگیره
کد اینه

customerTableAdapter.Delete(dataGridView1.CurrentR ow.Cells[0].Value.ToString(),
dataGridView1.CurrentRow.Cells[1].Value.ToString(),
dataGridView1.CurrentRow.Cells[2].Value.ToString(),
dataGridView1.CurrentRow.Cells[3].Value.ToString()
); );

پبغام خطاش اینه
Error 2 Argument '2': cannot convert from 'string' to 'long' E:\\WindowsFormsApplication9\Form1.cs 38 16 WindowsFormsApplication9

morteza271
شنبه 25 تیر 1390, 09:29 صبح
خوب باید اول تبدیلشون کنین به int یا long.
اینم کدشه :
Int32.Parse(dataGridView1.CurrentRow.Cells[3].Value.ToString());

long.Parse(dataGridView1.CurrentRow.Cells[3].Value.ToString());

amin tavakoli
شنبه 25 تیر 1390, 09:46 صبح
ممنون از پاسختون یکدفعه از خودم خجالت کشیدم خیلی چیزای ساده رو فراموش میکنم اگر لطف کنی یه نگاه به کدم بندازی ممنون میشم این کد خطایی نداره اما کاری رو که میخوام انجام نمیده و ان هم اینه که ردیف های انتخابی گرید ویو رو از جدول های پایگاه پاک کنه اما اینکار رو نمیکنه



tel_gooyaDataSet.customer.Rows.Remove(tel_gooyaDat aSet.customer[customerBindingSource.Position]);

customerTableAdapter.Delete
(dataGridView1.CurrentRow.Cells[0].Value.ToString(),
long.Parse(dataGridView1.CurrentRow.Cells[1].Value.ToString()),
dataGridView1.CurrentRow.Cells[2].Value.ToString(),
Int32.Parse(dataGridView1.CurrentRow.Cells[3].Value.ToString()));


customerTableAdapter.Update(tel_gooyaDataSet.custo mer);

morteza271
شنبه 25 تیر 1390, 10:04 صبح
به نظر من شما این کار رو بکنین درست میشه و بهتر هم هست:

اول متد delete تیبل آداپترتون رو تغییر بدین بگونه ای که یک id بگیره وسطر مورد نظر رو از دیتابیس حذف کنه.
و لازم نباشه تمام ستون ها رو بهش پاس بدین و فقط با یک id کار رو انجام بده در این صورت بهتره.

به نظر من چون الان متد delete به صورتیه که تمام ستون ها رو چک میکنه احتمالا یکیش بنا به دلایلی که فارسی مشکل داره نمیتونه سطر مورد نظر رو پیدا و حذف کنه.
موفق باشید

amin tavakoli
شنبه 25 تیر 1390, 12:05 عصر
یه سوال دیگه . کد هام درست شد ولی با هر پاک کردن یک سطر بالاتر حذف میشه به غیر از سطر اولی که میاد سطر دوم رو پاک می کنه و اگر سطری وجو د نداشته باشه پیغام زیر رو میده

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
د

morteza271
شنبه 25 تیر 1390, 12:13 عصر
دوست عزیز اگه امکانش هست کدتون رو بذارین تا در حد توانم کمکتون کنم.حتما id ها رو اشتباهی به تابع delete ارسال می کنید.
در مورد خطا هم خوب شما همیشه اینجور مواقع سعی کنید که قبل اینکه عملیات دیتابیس انجام بدین Validationها رو چک کنید.
مثلا در اینجا چک کنید که تعداد سطرها صفر نباشد و حتما سطری انتخاب شده باشه که در غیر اینصورت باید return کنه و عمل خاصی انجام نده.
اگه میشه کدتون رو بذارید.
موفق باشید

amin tavakoli
شنبه 25 تیر 1390, 13:21 عصر
کدم اینه .ببخشید مشکل دیگه ای که داره اگر در گریدم یکی از سلول ها خالی باشه آن ردیف رو در پایگاه داده پاک نمی کنه البته برای آپدیتش مشکلی نداره و اگر سلولی از گرید رو پر نکنم ان رو در پایگاه insert میکنه البته این رو هم بگم که این سلولهای خالی گرید در پایگاه اجازه null بودن رو دارند



private void button2_Click(object sender, EventArgs e)
{
tel_gooyaDataSet.customer.Rows.Remove(tel_gooyaDat aSet.customer[customerBindingSource.Position]);

customerTableAdapter.Delete
(dataGridView1.Rows[customerBindingSource.Position].Cells[0].Value.ToString(),
long.Parse(dataGridView1.Rows[customerBindingSource.Position].Cells[1].Value.ToString()),
dataGridView1.Rows[customerBindingSource.Position].Cells[2].Value.ToString(),
int.Parse(dataGridView1.Rows[customerBindingSource.Position].Cells[3].Value.ToString()));

customerTableAdapter.Update(tel_gooyaDataSet.custo mer);
customerTableAdapter.Fill(tel_gooyaDataSet.custome r);



}

morteza271
شنبه 25 تیر 1390, 13:47 عصر
ببینید من که گفتم متد Delete رو عوض کنید ولی عوض نکردید که!مطمئن باشید اونطوری که گفتم اگه متد Delete رو تغییر بدین درست میشه.
برای تغییرش برین داخل دیتاست و در قسمت Propertice از CustomerTableAdapter به کوئری Delete رفته و کوئریش رو به صورت زیر تغییر بدین :
Delete from tableName where id=@id

حالا وقتی میخواین یکی از سطرها رو حذف کنید کد زیر رو بنویسید:
CustomertableAdapter.Delete(DataGridView.CurrentRo w.Cells["id"].Value.ToString());
اینطوری مشکلتون حل میشه.
موفق باشید

amin tavakoli
شنبه 25 تیر 1390, 14:35 عصر
بازم ممنون کاملا درست می گفتید اما بازم سطر ها رو جابجا پاک می کنه مثلا به جای اینکه سطر 2 رو پاک کنه یک سطر عقب تر یعنی 1 رو پاک می کنه و نهایتا وقتی به سطر 0 میرسه ان رو پاک نمی کنه . این آخریش و بیشتر از این دیگه مزاحمتون نمیشم
کد هام اینه


private void button2_Click(object sender, EventArgs e)
{

try
{
tel_gooyaDataSet.customer.Rows.Remove(tel_gooyaDat aSet.customer[customerBindingSource.Position]);

customerTableAdapter.Delete(int.Parse(dataGridView 1.CurrentRow.Cells[3].Value.ToString()));


customerTableAdapter.Update(tel_gooyaDataSet.custo mer);
customerTableAdapter.Fill(tel_gooyaDataSet.custome r);
MessageBox.Show("عملیات با موفقیت انجام شد");

}
catch
{
MessageBox.Show("عملیات انجام نشد", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

amin tavakoli
شنبه 25 تیر 1390, 14:42 عصر
فکر کنم باید یه جای در sql server تنظیم کنم و بگم شماره ردیفها رو از صفر شروع کنه این طور نیست ؟

morteza271
شنبه 25 تیر 1390, 16:47 عصر
خواهش میکنم.
ببینید من کدتون رو به صورت زیر تغییر دادم و براتون گذاشتم،تست کنید ببینید درست حذف میکنه یا نه:
private void button2_Click(object sender, EventArgs e)
{
try
{
customerTableAdapter.Delete(int.Parse(dataGridView 1.CurrentRow.Cells[3].Value.ToString()));

//tel_gooyaDataSet.customer.Rows.Remove(tel_gooyaDat aSet.customer[customerBindingSource.Position]);
//customerTableAdapter.Update(tel_gooyaDataSet.custo mer);
customerTableAdapter.Fill(tel_gooyaDataSet.custome r);
MessageBox.Show("عمليات با موفقيت انجام شد");

}
catch
{
MessageBox.Show("عمليات انجام نشد", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}
}

همونطور که می بینید من دو سطر رو کامنت کردم چون به نظرم نیازی به اونا نیست البته شاید من نمیدونم چه کاربردی دارن.
اگه نیازی بهشون نیست که هیچی ولی اگه دلیل خاصی برای این دو خط داری و نخواستی حذفشون کنی به این روش عمل کن :
private void button2_Click(object sender, EventArgs e)
{
try
{
int ID = int.Parse(dataGridView1.CurrentRow.Cells[3].Value.ToString());

tel_gooyaDataSet.customer.Rows.Remove(tel_gooyaDat aSet.customer[customerBindingSource.Position]);

customerTableAdapter.Delete(ID);

customerTableAdapter.Update(tel_gooyaDataSet.custo mer);
customerTableAdapter.Fill(tel_gooyaDataSet.custome r);
MessageBox.Show("عمليات با موفقيت انجام شد");

}
catch
{
MessageBox.Show("عمليات انجام نشد", "اخطار", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}
}
موفق باشید