حذف و اديت در ديتابيس

Rainmater

Member
نحوه ي حذف و تغيير يك سطر از جدول بانك اطلاعاتي رو اكه با يه مثال توضيح بديد ممنون ميشم.
 

Rainmater

Member
سلام the king ‎
عزيز

شما توي يه ‎ post ‎ديكه نحوهي اضافه و جستجو رو كفته بوديد،اكه حذف و ويرايش يك سطر و فيلد رو هم با مثال توضيح بديد ممنون ميشم.
(dataset,table adapter,sqlبا ‏)
 

the_king

مدیرکل انجمن
احتمالا منظورتون این تاپیکه و نمونه پروژه پیوستی SampleDB.zip :

ارتباط دادن با ديتا بيس

قبل از هر چیز، جدول table را با اطلاعات موجود در بانک اطلاعاتی پر کنید تا برای دسترسی به اطلاعات سطر ها
آماده باشد :
کد:
            MyDBDataSetTableAdapters.MyTBTableAdapter adapter
                = new MyDBDataSetTableAdapters.MyTBTableAdapter();
            MyDBDataSet.MyTBDataTable table
                = new MyDBDataSet.MyTBDataTable();
            adapter.Fill(table);

برای ویرایش کردن و یا حذف کردن یک یا چند سطر ابتدا بایستی آن سطر ها را به هر شیوه دلخواهی انتخاب کنید.
شیوه اول، با جستجو، مثلا تمامی سطر هایی که مقدار فیلد فلان شان بهمان باشد :
کد:
            DataRow[] rows = table.Select("FirstName = 'ali'");
در مثال بالا ما سطر هایی را در rows انتخاب می کنیم که مقدار فیلد FirstName شان ali باشد.
اگر چنین سطر هایی وجود نداشته باشند rows خالی خواهد بود (هیچ سطری در آن قرار نمی گیرد).

در مثال زیر ما در rows فقط سطری را انتخاب می کنیم که مقدار فیلد ID اش برابر 6 باشد :
کد:
            DataRow[] rows = table.Select("ID = '6'");
در مثال بالا اگر چنین فیلدی وجود نداشته باشد rows خالی خواهد بود (هیچ سطری در آن قرار نمی گیرد).

شیوه دوم، با شماره سطر ها، مثلا سطری که شماره اش n باشد:
کد:
DataRow row = table.Rows[0];
در مثال بالا ما سطر شماره 0 یعنی اولین سطر در جدول را در row انتخاب می کنیم.

شیوه سوم، حذف کردن مستقیم و بدون انتخاب کردن سطر :
برای حذف کردن مستقیم یک سطر بایستی مقدار تمامی فیلد های آن سطر را بطور کامل وارد کنید، مثلا :
کد:
            adapter.Delete(6, "ali", "saeid");
توجه کنید که در کد بالا ما برای حذف کردن سطر از table استفاده ای نکرده ایم و مستقیما به adapter فرمان
حذف سطر را داده ایم. این شیوه برای حذف کردن یک سطر خاص مناسب است، هم کد اش کوتاه است و هم سریع.

شما هر شیوه دیگری غیر از شیوه سوم را که بکار ببرید بایستی سطر یا سطر های مورد نظر را انتخاب کرده باشید
تا در مرحله بعدی آن سطر یا سطر های انتخاب شده را حذف یا ویرایش کنید :

برای حذف کردن سطر هایی که در rows انتخاب شده اند می توانید از یک حلقه استفاده کنید :
کد:
            for (int i = 0; i < rows.Length; i++)
                rows[i].Delete();
            adapter.Update(rows);
کد بالا با حالت خاصی که در rows هیچ سطری وجود نداشته باشد نیز مشکلی ندارد و خطا نمی دهد.

برای حذف کردن یک سطر که در row قرار گرفته (دقت کنید که rows یک آرایه بود، در حالی که row آرایه نیست)
می توانید از کد زیر استفاده کنید :
کد:
            row.Delete();
            adapter.Update(row);

برای ویرایش کردن محتویات یک یا چند فیلد در سطر یا سطر هایی که در rows انتخاب کرده اید می توانید از یک حلقه
استفاده کنید، مثلا در مثال زیر مقدار FirstName تمامی سطر های داخل rows به reza تغییر می کند :
کد:
            for (int i = 0; i < rows.Length; i++)
            {
                rows[i].BeginEdit();
                rows[i]["FirstName"] = "reza";
                rows[i].EndEdit();
            }
            adapter.Update(rows);

برای ویرایش کردن محتویات یک یا چند فیلد در سطر داخل row از کد زیر استفاده کنید :
کد:
            rows[0].BeginEdit();
            rows[0]["FirstName"] = "babak";
            rows[0].EndEdit();
            adapter.Update(row);
در مثال بالا مقدار فیلد FirstName در سطر row به babak تغییر می کند.

اگر دقت کنید در انتهای تمامی کد های ویرایش و حذف (بجز روش سوم که مستقیم است) از فرمان adapter.Update
استفاده شده تا آداپتور تغییرات داخل table را در بانک اطلاعاتی ثبت کند. اگر آن را حذف کنید، تغییرات در حافظه RAM
و table رخ می دهند، اما در بانک اطلاعاتی هیچ تغییری رخ نمی دهد و با دسترسی مجدد به بانک اطلاعاتی
سطر های ویرایش یا حذف شده مجددا به وضع قبلش شان برگشت داده می شوند.
 

Rainmater

Member
سلام
وقتي كدحذف رو امتحان كردم خطاي زير رو ميده:

update requires a valid deletecommand when passed datarow collection with deleted rows.
مشكل چي ميتونه باشه؟
 
آخرین ویرایش:

Rainmater

Member
datarow[] rows=table.select("firstname='ali'");
if(rows.length>0)
‎{
for (i=0;i<rows.length;i++)
rows.delete();
‎}
adapter.update(rows);
از table و آدابترش هم يك شي وجود داره.
هر سه روش رو تست كردم.به دستور update ارور ميده


در ضمن من با VC# 2005 تست كردم.
اگه امكانش هست يه مثال ساده رو به صورت عملي با VC# 2005 بزاريد.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
datarow[] rows=table.select("firstname='ali'");
if(rows.length>0)
‎{
for (i=0;i<rows.length;i++)
rows.delete();
‎}
adapter.update(rows);
از table و آدابترش هم يك شي وجود داره.
هر سه روش رو تست كردم.به دستور update ارور ميده

کد ها به ظاهر مشکلی ندارند، یه جای کار پروژه تون ایراد داره.

در ضمن من با vc# 2005 تست كردم.
اگه امكانش هست يه مثال ساده رو به صورت عملي با vc# 2005 بزاريد.
من ویژوال استدیو 2005 رو نصب نکرده ام، دیگه خیلی قدیمی شده.
 

Rainmater

Member
سلام
حق با شماست مشكا توي كد برنامه نبود
بالاخره بعد از كلي ور رفتن با برنامه مشكلو پيدا كردم
ظاهرا مشكل توي جدول بود و اون اينكه جدول من فيلد كليد(primary key) نداشت ولي وقتي يه فيلد رو PK در نظر گرفتم مشكل حل شد.
اما دليل منطقي اين مشكل رو نهميدم كه چرا بايد حتما جدول PK داشته باشه؟؟؟؟


يه مسئله ديگه كه هست اينه كه وقتي ديتابيس رو از نوع access در نظر ميگيري به روش سوم delete كردن كه شما گفتيد (كه مستقيما با dapter در ارتباط بود) برنامه متد delete رو نميشناسه -در واقع روش سوم عملا اجرا نميشه-اما وقتي اونو از نوع SQl ميگيري مشكل حل ميشه؟؟؟؟
 

the_king

مدیرکل انجمن
سلام
حق با شماست مشكا توي كد برنامه نبود
بالاخره بعد از كلي ور رفتن با برنامه مشكلو پيدا كردم
ظاهرا مشكل توي جدول بود و اون اينكه جدول من فيلد كليد(primary key) نداشت ولي وقتي يه فيلد رو PK در نظر گرفتم مشكل حل شد.
اما دليل منطقي اين مشكل رو نهميدم كه چرا بايد حتما جدول PK داشته باشه؟؟؟؟
دومین قانون از مجموعه قوانین جامعیت داده در بانک اطلاعاتی، جامعیت موجودیته (Entity Integrity) که بایستی
جدول هیچگونه رکورد تکراری نداشته باشد. برای تضمین کردن این مساله وجود کلید اصلی یا هر گونه فیلد غیر تکراری
در جدول الزامی است.

يه مسئله ديگه كه هست اينه كه وقتي ديتابيس رو از نوع access در نظر ميگيري به روش سوم delete كردن كه شما گفتيد (كه مستقيما با dapter در ارتباط بود) برنامه متد delete رو نميشناسه -در واقع روش سوم عملا اجرا نميشه-اما وقتي اونو از نوع SQl ميگيري مشكل حل ميشه؟؟؟؟
در پروژه پیوستی بانک اطلاعاتی یک فایل Microsoft Access بود که بدون مشکل از این شیوه سوم استفاده می کنه،
حالا نمی دونم مشکل از پروژه شما است یا Visual Studio 2005 همچین قابلیتی رو نداره یا کلا نتیجه گیری تون اشتباهه.
حدس ام اینه که بانک اطلاعاتی شما در وضعیت Copy always قرار داره که اینطور نتیجه گرفتید.
 

Rainmater

Member
در رابطه با PK من در جدول فيلد تكراري نداشتم!!
و در رابطه با روش سوم حذف كردن ببخشيد من برعكس كفتم(يعني SQL متد delete رو نميشناسه،و در اكسس جواب ميده)؟
 

Rainmater

Member
با تشکر از زحماتی که میکشید میخواتستم بدونم که
در کل به این نوع کار کردن با دیتابیس چی میگن؟
 

the_king

مدیرکل انجمن
با تشکر از زحماتی که میکشید میخواتستم بدونم که
در کل به این نوع کار کردن با دیتابیس چی میگن؟

اسم خاصی نداره، چون ارتباط از طریق ADO.Net انجام می گیره بهش دسترسی به داده از طریق ADO.Net میگویند.
شیوه ارتباط اصلی زبان های Net. با داده همین ADO.Net است که با نام System.Data در Framework ارائه میشه.

ADO.Net خودش نسخه تکمیلی ADO یا همون ActiveX Data Objects ای است که سال 1996 توسط مایکروسافت
ارائه شده بود که دیگه برای زبان های مدرن تحت Net. مناسب نبود.
 

جدیدترین ارسال ها

بالا