کد های برنامه بالا رو با کمی توضیحات جلوی هر کد که نیاز به توضیح هست قرار دادم. امیدوارم خوب بررسی کنید. در ضمن برای چک کردن لازم به استفاده از شبکه نیست شما می تونید با تغییر ساعت سیستم و همچنین دستکاری مستقیم تو دیتابیس این کار رو انجام بدید.
مثال
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