PDA

View Full Version : کمک در تغییر داده های جدول



swallow.pa
جمعه 18 فروردین 1391, 17:05 عصر
سلام به همه دوستان
عکسی رو که گذاشتم مربط به دو جدوله تحت عنوان Person و BookCard اشتباهی که برنامه نویس قبلا روی این بانک انجام داده اینه که Id جدول Person رو کلید اصلی قرار داده بود در صورتیکه خود PersonId باید کلید اصلی باشه و اینو بگم Id و PersonId مقادیرشون متفاوته
حالا من می خوام تمام PersonRef توی جدول BookCard رو به PersonId تغییر بدم من فقط سوالم اینه:

می خوام اگه تغییراتی توی دیتابیس بدم خطائی اتفاق افتاد اون تغییرات منتفی بشه
و چه راه حل بهتری سراغ دارید
ضمنا اطلاعات توی جدولها خیلی هستن
کدهای من اینه دوستان -ارتباط جدولها رو برداشتم

Dim I As Integer = 0
Dim F As Integer = 0
With bsPerson
.MoveFirst()
ProgressBarX1.Maximum = .Count
For I = 1 To .Count
DataSet1.BookCard.Clear()
BookCardTableAdapter.Fill(DataSet1.BookCard, .Current.Item("Id"))
If bsBookCard.Count <> 0 Then
bsBookCard.MoveFirst()
ProgressBarX2.Maximum = bsBookCard.Count
For F = 1 To bsBookCard.Count
bsBookCard.Current.Item("PersonRef") = .Current.Item("PersonId")
bsBookCard.MoveNext()
ProgressBarX2.Value = F
Next F
bsBookCard.EndEdit()
BookCardTableAdapter.Update(DataSet1.BookCard)
End If
.MoveNext()
ProgressBarX1.Value = I
Next I

C#.net
جمعه 18 فروردین 1391, 17:24 عصر
پیشنهاد می کنم به ترتیب:

1- عملیات کانورت رو زمانی انجام بدید که حداقل تراکنش در سیستم وجود داشته باشه(مثلا آخر شب)
2- از اطلاعات بک آپ بگیرید
3- کد مربوط به کانورت رو به صورت ترنزکشنال در خود دیتابیس با الگوی زیر:



BEGIN TRY
BEGIN TRANSACTION -- شروع تراکنش

-- کد مربوط به به روز رسانی جدول
UPDATE BookCard
SET PersonRef =(Select PersonId
from Person
where Id =BookCard.PersonRef )

-- انجام موفق بدون خطا، ثبت تغییرات!
COMMIT
END TRY
BEGIN CATCH
-- وجود خطا، برگرداندن تغییرات
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH


موفق باشید!

swallow.pa
جمعه 18 فروردین 1391, 18:08 عصر
با تشکر می تونید در مورد بند 3 توضیح بدید ممنون

C#.net
جمعه 18 فروردین 1391, 18:57 عصر
کافیه کدی که براتون پیوست رو یه بررسی در مورد قسمت UPDATE بکنید که درست باشه و در نهایت در دیتابیستون اجرا کنید
در این کد عملیات به روز رسانی همه رکورد ها داخل یک ترنزکشن قرار گرفته(خط 2) و این ترنزکشن در یک بلوک خطا یابی TRY قرار گرفته(خط 1)، پس هر وقت خطایی در بروز رسانی هر یک از رکورد ها رخ بده برنامه وارد بلوک CATCH خواهد شد(خط 13) که در این صورت تراکنش ROLBACK شده و هیچ تغییری در دیتا ها اعمال نمی شه،
اگر هم خطایی رخ نده، برنامه به دستور COMMIT (خط 11) می رسه و اطلاعات به روز رسانی شده در دیتابیس ثبت می شه.

swallow.pa
جمعه 18 فروردین 1391, 19:31 عصر
دوست من از لطفتون سپاسگذارم
یک سوال دیگه من کنترل و SPACE رو با هم می زنم چرا توابع SQL رو برام نشون نمی دهد مثل محیط vs دیدید که تا یک حرف رو توی محیط کد نویسی تایپ می کنید کلیه توابع و ... رو لیست می کنه
چرا برای sql نمی آد
ممنون

C#.net
جمعه 18 فروردین 1391, 19:59 عصر
SQL Server 2008 تا حدودی این قابلیت رو داره، البته نه در حد VS.Net

swallow.pa
جمعه 18 فروردین 1391, 20:02 عصر
خب من هم sql server 2008 دارم چیکار کنم که لیستها بیاد
ممنون

C#.net
جمعه 18 فروردین 1391, 21:16 عصر
خب من هم sql server 2008 دارم چیکار کنم که لیستها بیاد
ممنون

دلایل مختلفی می تونه داشته باشه، پیشنهاد می کنم در تاپیک مربوط به sql یه پست با عنوان مناسب برای این مشکل ایجاد کنید تا دوستان بتونن کمکتون کنند

swallow.pa
جمعه 18 فروردین 1391, 21:31 عصر
ممنون از لطفتون دوست عزیز