PDA

View Full Version : سوال: کار با dataset در برنامه نویسی شبکه



ali190
شنبه 17 اردیبهشت 1390, 11:42 صبح
باسلام و عرض خسته نباشید
فرض کنید یه برنامه داریم که قراره ازش در شبکه استفاده کنیم
در این برنامه یک دیتاست وجود داره که 1 رکورد رو در آن واحد در سیستم دو یوزر نشون میده (توسط دیتا آداپتر fill میشه)
حالا کاربر اول این رکورد رو در دیتاست حذف میکنه و تغییرات رو در دیتابیس بروز میکنه
کاربر دوم بی خبر از همه جا داره فیلدهای همون رکورد رو ویرایش میکنه و قصد داره بعد از انجام کارش اون تغییرات رو در دیتابیس منعکس کنه ، ولی خبر نداره که رکورد از دیتابیس حذف شده
با زدن دکمه ثبت تغییرات حتماً از سمت برنامه یه ارور میگیره که اصلاً همچین رکوردی در دیتابیس وجود ندارد
میخواستم از اساتید محترم خواهش کنم یه مقدار از نحوه استفاده از دیتاست در شبکه و نحوه مدیریت خطاهای اون (در کل مدیریت دیتاست در بحث های شبکه ) در این تایپیک بحث نمایند
ممنون و متشکر ازلطف دوستان
یاعلی

barbodsoft.com
شنبه 17 اردیبهشت 1390, 12:37 عصر
من هم همین مشکل رو دارم.

saeid.memfis
شنبه 17 اردیبهشت 1390, 22:15 عصر
سلام دوست من
من دقیقا نمی دونم ولی چیزی که به ذهنم میرسه رو می گم...
راه حل اول:هنگام حذف رکورد یک پیغام به بقیه کلاینت ها بفرستید مبنی بر حذف رکورد
راه حل دوم:وقتی که فرم حذف در یک کلاینت باز هست اجازه ویرایش رو به بقیه کلاینت ها نده(الگوریتمش با خودتون: میشه یک فیلد رو هنگام باز شدن فرم حذف 1 کرد و هنگامی که بسته شد 0 بشه)
راه حل سوم:و هنگامی که یک رکورد در حال ویرایش هست(فرم ویرایش در حال اجراست اجازه حذف رکورد خاص رو نده(مثال:هنگامی که کلید رکورد رو جهت جستجو و بعد ویرایش انتخاب می کنید فیلدی رو مبنی بر در حال ویرایش بودن 1 کنید . حالا تو فرم حذف اگه اون کلید رو وارد کنید برای حذف شرط 1 یا 0 بودن این فیلد رو چک کنید اگر 1 هست اجازه پاک ندهید و اگر صفر هست پاک شود.)
فکر کنم راه حل سوم بهتره

barbodsoft.com
یک شنبه 18 اردیبهشت 1390, 00:28 صبح
این روش باعث می شه بانک همیشه در حال ویرایش باشه و کار زیادی از برنامه نویس و همچنین سیستم می بره. و احتمال خطا برنامه نویس هم زیاده.

فکر می کنم بهترین راه برای این کار این باشه که قبل از حذف یا ویرایش چک کنیم این رکورد وجود دارد یا نه. در صورتی که وجود دارد که هیچ در غیر اینصورت به کاربر پیغام مناسب داده شود و عمل ویرایش یا حذف متوقف شود.

saeid.memfis
یک شنبه 18 اردیبهشت 1390, 08:42 صبح
این روش باعث می شه بانک همیشه در حال ویرایش باشه و کار زیادی از برنامه نویس و همچنین سیستم می بره. و احتمال خطا برنامه نویس هم زیاده.

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


فکر می کنم بهترین راه برای این کار این باشه که قبل از حذف یا ویرایش چک کنیم این رکورد وجود دارد یا نه. در صورتی که وجود دارد که هیچ در غیر اینصورت به کاربر پیغام مناسب داده شود و عمل ویرایش یا حذف متوقف شود.

نه دیگه اینطوری که نمیشه شاید اون رکورد هنوز پاک نشده باشه و شروع کنه به ویرایش و قبل از آپدیت کردن و در حال اعمال تغییرات اونو پاک کنن!میشه همون آش و همون کاسه

ali190
یک شنبه 18 اردیبهشت 1390, 20:18 عصر
بنظر این ره ها یه جور غیرمنطقی میاد
فکر کنم زاه های بهتری در این مورد وجود داشته باشه

barbodsoft.com
یک شنبه 18 اردیبهشت 1390, 20:30 عصر
نه دیگه اینطوری که نمیشه شاید اون رکورد هنوز پاک نشده باشه و شروع کنه به ویرایش و قبل از آپدیت کردن و در حال اعمال تغییرات اونو پاک کنن!میشه همون آش و همون کاسه

عمل ویرایش و یا حذف در چند صدم ثانیه انجام می شه این چیزی که شما فرمودید احتمال 1 به میلیون هم نیست.

saeid.memfis
یک شنبه 18 اردیبهشت 1390, 20:42 عصر
عمل ویرایش و یا حذف در چند صدم ثانیه انجام می شه این چیزی که شما فرمودید احتمال 1 به میلیون هم نیست.

درست میگی
ولی شما فکر کن که برای ویرایش اول باید کلید رکورد رو جهت جستجو زد و بعد از پر شدن فیلدها شروع به تغییر کرد..حالا اگه 10 تا فیلد رو خواسته باشه عوض کنه هر چقدر هم سریع بزنه 20 30 ثانیه ای طول میکشه(تازه این مال 10 تا فیلد بود) نظر من این زمان بود

saeid.memfis
یک شنبه 18 اردیبهشت 1390, 20:43 عصر
بنظر این ره ها یه جور غیرمنطقی میاد
فکر کنم زاه های بهتری در این مورد وجود داشته باشه

اگه باگهاشو بگیری که مشکلی نداره
درسته که تولید بار اضافه می کنه برای برنامه
ولی با کامپیوترهایی که ما از اونا استفاده می کنیم دیگه به مسائلی مثل حافظه و ... هم میشه توجه نکرد

mc_laren
یک شنبه 18 اردیبهشت 1390, 22:20 عصر
به نظر من اگه مشکلی که گفتین همینه یعنی فقط ترس از خطا دارین که منطقا نباید خطا رخ بده چون اگه بخواد ویرایش کنه وقتی شرط ویرایش تون که کد رکورد مورد نظر هست و اون هم از قبل پاک شده، پس رکوردی با اون کد پیدا نمیشه که بخواد ویرایش کنه و خطا بده. برای حذف کردن هم همین مسئله وجود داره.

ali190
دوشنبه 19 اردیبهشت 1390, 18:55 عصر
پاسخها قانع کننده نیست
از دیتاست و دیتا آداپتر بعیده در این خصوص متدی نداشته باشند
هر چه باشه دات نت باید از vb6 قوی تر باشه
من این کار ها رو سالهاست دارم بدون کوچکترین مشکلی در vb6 انجامش میدم
:متعجب:

barbodsoft.com
سه شنبه 20 اردیبهشت 1390, 01:15 صبح
درست میگی
ولی شما فکر کن که برای ویرایش اول باید کلید رکورد رو جهت جستجو زد و بعد از پر شدن فیلدها شروع به تغییر کرد..حالا اگه 10 تا فیلد رو خواسته باشه عوض کنه هر چقدر هم سریع بزنه 20 30 ثانیه ای طول میکشه(تازه این مال 10 تا فیلد بود) نظر من این زمان بود

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

saeid.memfis
سه شنبه 20 اردیبهشت 1390, 12:30 عصر
زمان ویرایش زمانی هست که شما روی دکمه ویرایش یا حذف کلیک می کنی. حالا اگر کاربر داره نیم ساعت این فرم رو می بینه که چه تغییراتی به فرمش بده ... این زمان ویرایش نیست.
شما چک می کنی بعد حذف یا ویرایش رو انجام می دی. کاملا هم منطقی هست.
درسته
من دیگه غیر از اینا چیز دیگه ای به ذهنم نمی رسه ...اگه به نتیجه برسه خوبه
من یه برنامه دارم که همینطوری دورش زدم..اگه راه بهتری باشه خیلی راحت تره

ali190
چهارشنبه 21 اردیبهشت 1390, 16:46 عصر
از دوستان کسی تا بحال نرم افزار تحت شبکه با vb.net نوشته؟
یاعلی

saeid.memfis
چهارشنبه 21 اردیبهشت 1390, 23:41 عصر
از دوستان کسی تا بحال نرم افزار تحت شبکه با vb.net نوشته؟
یاعلی

سلام
بله..من نوشتم..یه برنامه مدیریت سهام بود که ریموت دسکتاپ و از این جور چیزا هم داشت...
بانک هم رو سرور بود دیگه

barbodsoft.com
پنج شنبه 22 اردیبهشت 1390, 00:46 صبح
از دوستان کسی تا بحال نرم افزار تحت شبکه با vb.net نوشته؟
یاعلی

خیلی ها نوشتن. دوست من این مسئله خیلی بغرنجی نیست. من از این روشی که استفاده می کنم. خیلی زود کاربر عادت می کنه و می فهمه چرا این اتفاق افتاده و کاملا هم طبیعی هست. تو زندگی عادی هم همچین اتفاقاتی می فته. (می سر یخچال میوه برداری می بینی قبلا دادش شکموت همه میوه ها رو خورده :چشمک:)

این کاملا طبیعی و قابل درک هست.

ali190
پنج شنبه 22 اردیبهشت 1390, 10:14 صبح
سلام
ممنون از همه عزیزانی که در این مورد نظر دادند
میشه در این خصوص یک نمونه پروژه قرار دهید؟
ممنون و متشکر از لطف شما
یاعلی

mpmsoft
پنج شنبه 22 اردیبهشت 1390, 13:10 عصر
برای این منظور شما اولا نباید کل رکوردها رو بیارید تو دیتاست چون با این کار دارید بصورت offline و بی خبر از بانک اطلاعات رو نمایش و یا ویرایش می کنید
برای این کار شما باید در زمان ذخیره اطلاعات از صحت وجود رکورد و یا فیلدهای تغییر داده شده در بانک مطلع شوید چون ممکن هست دونفر یک رکورد را ویرایش کنن یکی نام و یکی نام خانوادگی رو تغییر بدن در این صورت تکلیف چیه ؟

شما باید دقیقا فیلدی رو در بانک اصلاح کنید که واقعا یوزر تغییر داده شده
و همچنین رکوردهایی رو در بانک اصلاح کنید که وجود داشته باشده که این روند باید بصورت دستی کنترل شود

ASKaffash
شنبه 24 اردیبهشت 1390, 08:09 صبح
سلام
من می خواهم به اصل سئوال اشاره کنم :
باید دقت کنیم که مفهوم DataSet شبیه یک DataBase کوچک در حافظه Client است و DataTable و DataView و DataRelation به مانند اشیاء بانک درون یک DataSet حالا نحوه حل مسئله به حساسیت پروِژه شما بر می گردد اگر هم زمانی و اثر انعکاس تغییرات کم است استفاده از اشیائی مثل DataTable و ... مشکلی نیست ولی اگر حساسیت آنقدر است که در صورت تغییر توسط یک کاربر اثر باید به دیگران منعکس شود بهترین کار Lock کردن Row های مورد نظر است بنابراین وقتی تعدادی Row در انحصار کاربری است باید هشدار به دیگر کاربران منعکس شود مثلا در SQLServer با شکل ذیل می توان تعدادی Row را Lock کرد(شبیه این دستور در اراکل هم وجود دارد)


Set Tran Isolation Level Serializable
Begin Tran
Select * From T1 With (RowLock) Where A1=2

barbodsoft.com
شنبه 24 اردیبهشت 1390, 10:00 صبح
سلام
من می خواهم به اصل سئوال اشاره کنم :
باید دقت کنیم که مفهوم DataSet شبیه یک DataBase کوچک در حافظه Client است و DataTable و DataView و DataRelation به مانند اشیاء بانک درون یک DataSet حالا نحوه حل مسئله به حساسیت پروِژه شما بر می گردد اگر هم زمانی و اثر انعکاس تغییرات کم است استفاده از اشیائی مثل DataTable و ... مشکلی نیست ولی اگر حساسیت آنقدر است که در صورت تغییر توسط یک کاربر اثر باید به دیگران منعکس شود بهترین کار Lock کردن Row های مورد نظر است بنابراین وقتی تعدادی Row در انحصار کاربری است باید هشدار به دیگر کاربران منعکس شود مثلا در SQLServer با شکل ذیل می توان تعدادی Row را Lock کرد(شبیه این دستور در اراکل هم وجود دارد)


Set Tran Isolation Level Serializable
Begin Tran
Select * From T1 With (RowLock) Where A1=2


ممنون دوست عزیز من نمی دونستم می شه همچین کاری هم کرد.
با این توضیحی که شما دادید چند سوال دیگر هم پیش می یاد.
1- چطور سایر یوزرها می فهمند که رکوردی lock شده؟
2- چطور باید از حالت lock خارج کرد؟
3 - اگه برق بره یا برنامه بدون اینکه سطر های lock شده برگردونده بشن بسته بشه چیکار باید کرد؟
4- آیا این روش cpu usege زیادی ندارد؟

AMIBCT
شنبه 24 اردیبهشت 1390, 13:11 عصر
وقتي رديفي قفل مي‌شه كسي متوجه نمي‌شه تا زماني كه بخواد رديف رو ويرايش يا حذف كنه كه با خطا مواجه مي‌شه

اين روش هم به تنهايي مشكل رو حل نمي‌كنه
باز هم بايد در برنامه پيش‌بيني بشه كه اگه موقع ويرايش يا حذف با قفل مواجه شد، عكس‌العمل مناسب انجام بده

barbodsoft.com
شنبه 24 اردیبهشت 1390, 14:23 عصر
وقتي رديفي قفل مي‌شه كسي متوجه نمي‌شه تا زماني كه بخواد رديف رو ويرايش يا حذف كنه كه با خطا مواجه مي‌شه

اين روش هم به تنهايي مشكل رو حل نمي‌كنه
باز هم بايد در برنامه پيش‌بيني بشه كه اگه موقع ويرايش يا حذف با قفل مواجه شد، عكس‌العمل مناسب انجام بده

پس با این تفاضیل قفل کردن فایده ای نخواهد داشت.

ASKaffash
یک شنبه 25 اردیبهشت 1390, 07:44 صبح
سلام
هنگام ارسال هر دستور Update یا delete از طریق برنامه کاربری شما یک Exception دریافت می شود (باtry و... ) که متناسب با عدد خطای دریافتی Lock شدن رکورد قابل تشخیص است فقط یک کم CommandTimeOut را کمتر کنید تا زیاد طولانی نشود

ali190
یک شنبه 25 اردیبهشت 1390, 08:25 صبح
سلام
ممنون و متشکر از دوستان عزیز بخصوص جناب کفاش عزیز
میشه از شما بزرگورارن خواهش کنم یه مثال کوچیک در قالب یه نمونه پروژه ارائه نمائید تا ما مبتدی ها هم یه مقدار اصل قضیه رو درک کنیم
ممنون و متشکر
یاعلی

AMIBCT
یک شنبه 25 اردیبهشت 1390, 08:38 صبح
اگه اصولي بخواهيد كار كنيد
بايد براي هر جدول يه فيلد كه آخرين تاريخ تغيير رو در خودش ذخيره مي‌كنه، اضافه كنيد

موقعي كه كاربر اطلاعات رو براي ويرايش از پايگاه داده گرفت، اين تاريخ هم در سمت كاربر تغيير دهنده ذخيره بشه

وقتي كه كاربر خواست اطلاعات رو در بانك ويرايش كنه، دستور Update رو علاوه بر شرط ستون كليدي، بر اساس تاريخ به‌روزرساني هم شناسايي كنيد

اگه مقدار بازگشت داده شده توسط دستور Update برابر ۱ بود كه معلوم مي‌شه به‌روزرساني موفقيت‌آميز بوده و اطلاعات هم در اين بين تغيير نكرده
اگه مقدار بازگشتي برابر ۰ بود معلوم مي‌شه كه كسي اطلاعات رو ويرايش كرده و تاريخ به‌روزرساني رو تغيير داده

حالا بسته به نوع جدول و نوع كاربر و سياستي كه مدير برنامه مي‌تونه انتخاب كنه، ممكنه از ويرايش صرف‌نظر كنيد، اطلاعات ويرايش شده رو به كاربر نشون بديد و تصميم رو بر عهده‌ي كاربر بذاريد و يا اطلاعات رو دوباره بخواهيد ويرايش كنيد

barbodsoft.com
یک شنبه 25 اردیبهشت 1390, 12:23 عصر
سلام دوستان
من با توجه به روشهای که قبلا به کار می بردم و همچینی بحث های که اینجا شد. یک برنامه نوشتم که دوستان می تونن چک کنن و نتیجه رو همین جا بزارید.
کارهای که انجام دادم.
1- تاریخ آخرین ویرایش ثبت می شه.
2- قبل از ثبت چک می شود که رکورد وجود داره یا نه.
3- قبل از حذف چک می شود قبلا ویرایش یا حذف شده یا نه.
4 - قبل از ویرایش چک می شود قبلا ویرایش یا حذف شده یا نه

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

barbodsoft.com
دوشنبه 26 اردیبهشت 1390, 00:03 صبح
کد های برنامه بالا رو با کمی توضیحات جلوی هر کد که نیاز به توضیح هست قرار دادم. امیدوارم خوب بررسی کنید. در ضمن برای چک کردن لازم به استفاده از شبکه نیست شما می تونید با تغییر ساعت سیستم و همچنین دستکاری مستقیم تو دیتابیس این کار رو انجام بدید.
مثال
1- یک رکورد ثبت کنید.
2- بدون اینکه برنامه رو ببندید . ساعت سیستم رو عقب ببرید.
3- حالا برید رکوردی رو که ایجاد کردید رو حذف کنید. پیغام مناسب رو خواهید دید.

مثال
1-برنامه رو اجرا کنید
2- برید تو برنامه sqlserver mangment و مستقیما یک رکورد رو حذف کنید.
3- شما هنوز اون رکورد رو می تونید ببینید. این درحالی هست که حذف شد از دیتابیس
4- اون رکورد رو ویرایش کنید. پیغام مناسب ظاهر خواهد شد

فکر کنم کدها به اندازه کافی خوانا هست و امیدوارم مفید بوده باشه. منتظر نظرات سازنده شما هستم.



Imports System.Data.SqlClient
Public Class Form1
Dim OCM As CurrencyManager
Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\testdb.mdf;Integrated Security=True;User Instance=True")
Dim SeeRecordTime As Date ' با این متغیر زمان پر شدن دیتاست رو نگه می داریم
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
con.Open()
fileAgain()

End Sub


Private Sub fileAgain()
Dim da As New SqlDataAdapter("select * from personal", con)
Dim ds As New DataSet
da.Fill(ds, "personal")
Dim dv As DataView = New DataView(ds.Tables("personal"))
OCM = CType(Me.BindingContext(dv), CurrencyManager)
TxtId.DataBindings.Clear()
TXTName.DataBindings.Clear()
TXTTell.DataBindings.Clear()
TXTModify.DataBindings.Clear()
TxtId.DataBindings.Add("text", dv, "id")
TXTName.DataBindings.Add("text", dv, "name")
TXTTell.DataBindings.Add("text", dv, "tell")
TXTModify.DataBindings.Add("text", dv, "modify")

If OCM.Count = 0 Then
TxtId.Text = ""
TXTName.Text = ""
TXTTell.Text = ""
TXTModify.Text = ""
Else
OCM.Position = OCM.Count - 1
showposition()
End If
SeeRecordTime = Now ' بعد از هر بار مقدار دهی دیتاست زمان اینکار در متغیر ذخیره می شود
End Sub

Private Sub BTNNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNNew.Click
If BTNNew.Text = "جدید" Then
TxtId.DataBindings.Clear()
TXTName.DataBindings.Clear()
TXTTell.DataBindings.Clear()
TXTModify.DataBindings.Clear()
BtnAdd.Enabled = True
BTNDel.Enabled = False
BTNEdit.Enabled = False
BTNNew.Text = "انصراف"
TxtId.Text = SelectMax()
TXTName.Text = ""
TXTTell.Text = ""
TXTModify.Text = ""
Else
BtnAdd.Enabled = False
BTNDel.Enabled = True
BTNEdit.Enabled = True
BTNNew.Text = "جدید"
fileAgain()
End If
End Sub
''' <summary>
''' با این تابع بزرگترین کد دریافت می شود
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Function SelectMax()
Dim cmd As New SqlCommand("select max(id) from personal", con)
Dim obj As Object = cmd.ExecuteScalar
If obj IsNot DBNull.Value And obj IsNot Nothing Then
Return CType(obj, Integer) + 1
Else
Return 1
End If
End Function

Private Sub BtnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAdd.Click
If TXTName.Text Is Nothing Or TXTTell.Text Is Nothing Then
MessageBox.Show("لطفا اطلاعات رو بصورت کامل وارد نمایید")
Exit Sub
End If

If SelectMax() <> Val(TxtId.Text) Then ' تو این دستور چک می شود آیا این کد قبلا توسط یوزر دیگری ثبت شد یا نه
If MessageBox.Show("شماره کد قبلا ثبت شده - احتمالا از شبکه و توسط شخص دیگری" _
& vbCrLf & "شما دو انتخاب دارید" & vbCrLf & _
"1- روی بله کلیک کنید و اجازه بدهید سیستم کد جدیدی برای ثبت انتخاب کند" _
& vbCrLf & "2- روی خیر کلیک کنید تا ثبتی انجام نشود", _
"", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then Exit Sub
'اگه متن پیغام رو خوب بخونید به کاری هم که انجام می دهد پب خواهید برد
End If

Dim cmd As New SqlCommand("insert into personal(id,name,tell,modify)values(@id,@name,@tel l,@modify)", con)
With cmd
.Parameters.Add(New SqlParameter("@id", SqlDbType.BigInt)).Value = SelectMax()
.Parameters.Add(New SqlParameter("@name", SqlDbType.NVarChar)).Value = TXTName.Text
.Parameters.Add(New SqlParameter("@tell", SqlDbType.NChar, 10)).Value = TXTTell.Text
.Parameters.Add(New SqlParameter("@modify", SqlDbType.DateTime)).Value = Now ' زمان ثبت در فیلد مورد نظر ذخیره می شود
End With
cmd.ExecuteNonQuery()
MsgBox("ثبت با موفقیت انجام شد")
BTNNew_Click(sender, e)

End Sub

Private Sub showposition()
txt.Text = OCM.Position + 1 & " " & "از" & " " & OCM.Count
End Sub

Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click
OCM.Position = 0
showposition()
End Sub

Private Sub btnBack_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBack.Click
OCM.Position -= 1
showposition()
End Sub

Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
OCM.Position += 1
showposition()
End Sub

Private Sub BtnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnLast.Click
OCM.Position = OCM.Count - 1
showposition()
End Sub

Private Sub BTNDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNDel.Click

Dim i As Integer
Dim cmd As New SqlCommand("select modify from personal where id=" & Val(TxtId.Text) & "", con)
Dim obj As Object = cmd.ExecuteScalar
If obj IsNot DBNull.Value And obj IsNot Nothing Then 'چک می شود این رکورد قبلا حذف شده یا نه
If SeeRecordTime < CType(obj, Date) Then ' این کد مشخص می کند که این رکورد توسط شخص دیگری ویرایش شد یا نه
If MessageBox.Show("این رکورد در حین دیدن شما توسط شخص دیگری ویرایش شد" _
& vbCrLf & "آیا با این وجد می خواهید حذف انجام شود؟", _
"", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then
i = OCM.Position
fileAgain()
OCM.Position = i
Exit Sub
End If
End If
Else
MsgBox("این رکورد قبلا حذف شده")
fileAgain()
Exit Sub
End If

cmd = New SqlCommand("delete personal where id=" & Val(TxtId.Text) & "", con)
cmd.ExecuteNonQuery()
fileAgain()
End Sub

Private Sub BTNEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNEdit.Click
Dim i As Integer
Dim cmd As New SqlCommand("select modify from personal where id=" & Val(TxtId.Text) & "", con)
Dim obj As Object = cmd.ExecuteScalar
If obj IsNot DBNull.Value And obj IsNot Nothing Then 'چک می شود این رکورد قبلا حذف شده یا نه
If SeeRecordTime < CType(obj, Date) Then ' این کد مشخص می کند که این رکورد توسط شخص دیگری ویرایش شد یا نه
If MessageBox.Show("این رکورد در حین دیدن شما توسط شخص دیگری ویرایش شد" _
& vbCrLf & "آیا با این وجود می خواهید ویرایش انجام شود؟", _
"", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then
i = OCM.Position
fileAgain()
OCM.Position = i
Exit Sub
End If
End If
Else
MsgBox("این رکورد قبلا حذف شده")
fileAgain()
Exit Sub
End If

cmd = New SqlCommand("update personal(name=@name,tell=@tell,modify=@modify) where id=" & Val(TxtId.Text) & "", con)
With cmd
.Parameters.Add(New SqlParameter("@id", SqlDbType.BigInt)).Value = SelectMax()
.Parameters.Add(New SqlParameter("@name", SqlDbType.NVarChar)).Value = TXTName.Text
.Parameters.Add(New SqlParameter("@tell", SqlDbType.NChar, 10)).Value = TXTTell.Text
.Parameters.Add(New SqlParameter("@modify", SqlDbType.DateTime)).Value = Now
End With
cmd.ExecuteNonQuery()
i = OCM.Position
fileAgain()
OCM.Position = i
End Sub

End Class