PDA

View Full Version : جلوگیری از تکرار ثبت نام و نام خانوادگی تکراری



swallow.pa
شنبه 27 اسفند 1390, 20:20 عصر
سلام به همه برای جلوگیری از تکرار ثبت نام و نام خانوادگی مشابه توی برنامه یکی از روشها استفاده از عملگر LIKE می باشد مثلا توی بانک داریم محمد محمودی اگه کاربر محمد محمودی رو وارد کنه بعد از استفاده از عملگر Like در صورت وجود چنین نامی نرم افزار هشدار مورد نظر رو خواهد داد حالا سوالهای من اینه؟ 1- اگه شما جای من بودید مثلا به نام محمد محمودی زاده حساس می شدید یا نه؟ 2-اگه کاربر محمد محمودی توی بانک یا توی تکست باکس رو با کلید space حساس کرد چیکار کنم؟ 3-اصلا شما دوستان برای اینکار از همین عملگر Like استفاده می کنید یا چیز دیگه؟ متشکرم

aghayex
شنبه 27 اسفند 1390, 20:47 عصر
حرف شما کاملا درسته اما اینو یادتون باشه که به طور صد در صد آدم هایی پیدا می شن که دارای تشابه اسمی باشن و من خودم برا اینکار از صفت هایی استفاده می کنم که دارای اعداد هستن مثل شماره شناسنامه به همراه نام و نام خانوادگی و از همه بهتر کد ملی

mgh64120
شنبه 27 اسفند 1390, 20:58 عصر
سلام دوست عزيز
پاسخ سوال 1 : نه - مسلما محمودي با محمودي زاده يكسان نيست.
پاسخ سوال 2 : من براي اينكه بتونم روي اون تسلط كافي داشته باشم، نام و نام خانوادگي رو در دو فيلد مجزا ذخيره ميكنم
و مقدار ورودي كاربر رو Trim مي كردم تا Space از اول و آخر نام يا نام خانوادگي حدف و دردسرساز نباشه.
پاسخ سوال 3 : ميتوني از خاصيت PrimaryKey استفاده كني تا بانك اجازه ثبت چند نام و نام خانوادگي مشابه رو به كاربر نده.
از همه اينها گذشته، شما براي دسته بندي افراد بهتره كه از "شماره حساب" استفاده كنيد. چون دسترسي به حساب هر فرد از طريق نام و نام خانوادگي سخته.
و اگر شما دو مشتري با نامهاي يكسان داشتي، چه راه حلي براش در نظر داري. مثلا نام خانوادگي حسيني خيلي زياد هست اگر دو مشتري با نام علي حسيني داشته باشي نتيجه چي ميشه؟
ولي با استفاده از شماره حساب به اين مشكل بر نمي خوريد، چون دو عدد مشابه نداريم! خيلي پرحرفي كردم.
موفق باشيد...

swallow.pa
شنبه 27 اسفند 1390, 21:41 عصر
سلام دوست عزيز
پاسخ سوال 3 : ميتوني از خاصيت PrimaryKey استفاده كني تا بانك اجازه ثبت چند نام و نام خانوادگي مشابه رو به كاربر نده.
موفق باشيد...
می تونید در این مورد بیشتر توضیح بدید

فرید نجفلو
شنبه 27 اسفند 1390, 22:55 عصر
می تونید در این مورد بیشتر توضیح بدید

وقتی شما با دو ستون یک کلید اشتراکی ساختید ترکیب دو مقادیر دو ستون نمی تونن تکراری باشن
انگار که با هم مرج شدن و یک ستون هستن

headshoter
یک شنبه 28 اسفند 1390, 02:38 صبح
ببین این کد به دردت میخوره؟؟؟سورش هم مال اقای alimanam هست !! اگه خواستی بگو که سورس کاملشو بذارم!
Private Function CheckPersonExist(ByVal firstname As String, ByVal lastname As String) As Boolean
Try
cmd = New SqlCommand("Select fname,lname from Table1", cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()
Dim reader As SqlDataReader
reader = cmd.ExecuteReader
Dim value As Boolean = False
While reader.Read
If firstname = reader.GetString(0) And lastname = reader.GetString(1) Then
Return True
Exit While
End If
End While
If value Then
reader.Close()
Return True
Else
reader.Close()
Return False
End If
Catch ex As Exception
cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا هنگام شناسایی رکورد جدید")
End Try
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
If txt1.Text = String.Empty Or txt2.Text = String.Empty Then
MsgBox("لطفاً نام و نام خانوادگی را بنویسید", MsgBoxStyle.Exclamation)
Exit Sub
End If
If CheckPersonExist(txt1.Text, txt2.Text) = False Then
If cnn.State = ConnectionState.Closed Then cnn.Open()
Try
cmd = New SqlCommand("Insert Into Table1 (fname,lname) Values( @fname,@lname )", cnn)
With cmd
.Parameters.Clear()
.Parameters.AddWithValue("@fname", txt1.Text)
.Parameters.AddWithValue("@lname", txt2.Text)
.ExecuteNonQuery()
End With
Catch ex As Exception
MsgBox(Err.Description, MsgBoxStyle.Critical, "Error Happened For Add New Record")
End Try
ReloadRecord()
Else
MsgBox("مشخصات این شخص قبلاً در دیتابیس ثبت شده است" _
, MsgBoxStyle.Exclamation)
End If
cnn.Close()
Catch ex As Exception
cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا در اتصال به دیتابیس")
End Try
End Sub

swallow.pa
یک شنبه 28 اسفند 1390, 07:30 صبح
ببین این کد به دردت میخوره؟؟؟سورش هم مال اقای alimanam هست !! اگه خواستی بگو که سورس کاملشو بذارم!
Private Function CheckPersonExist(ByVal firstname As String, ByVal lastname As String) As Boolean
Try
cmd = New SqlCommand("Select fname,lname from Table1", cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()
Dim reader As SqlDataReader
reader = cmd.ExecuteReader
Dim value As Boolean = False
While reader.Read
If firstname = reader.GetString(0) And lastname = reader.GetString(1) Then
Return True
Exit While
End If
End While
If value Then
reader.Close()
Return True
Else
reader.Close()
Return False
End If
Catch ex As Exception
cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا هنگام شناسایی رکورد جدید")
End Try
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
If txt1.Text = String.Empty Or txt2.Text = String.Empty Then
MsgBox("لطفاً نام و نام خانوادگی را بنویسید", MsgBoxStyle.Exclamation)
Exit Sub
End If
If CheckPersonExist(txt1.Text, txt2.Text) = False Then
If cnn.State = ConnectionState.Closed Then cnn.Open()
Try
cmd = New SqlCommand("Insert Into Table1 (fname,lname) Values( @fname,@lname )", cnn)
With cmd
.Parameters.Clear()
.Parameters.AddWithValue("@fname", txt1.Text)
.Parameters.AddWithValue("@lname", txt2.Text)
.ExecuteNonQuery()
End With
Catch ex As Exception
MsgBox(Err.Description, MsgBoxStyle.Critical, "Error Happened For Add New Record")
End Try
ReloadRecord()
Else
MsgBox("مشخصات این شخص قبلاً در دیتابیس ثبت شده است" _
, MsgBoxStyle.Exclamation)
End If
cnn.Close()
Catch ex As Exception
cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا در اتصال به دیتابیس")
End Try
End Sub
ممنون می شم کمک کنید

headshoter
دوشنبه 07 فروردین 1391, 15:59 عصر
امیدوارم مشکلت حل شه .
http://www.mediafire.com/?pdydp4it4ud3q51

koorosh-soft
سه شنبه 08 فروردین 1391, 01:05 صبح
می تونید در این مورد بیشتر توضیح بدید

با Primary Key از ایجاد رکورد های تکراری جلوگیری میکنی
کلید اصلی و کلید خارجی دونوع Key هست مطلب تو همین فروم زیاده یه سرچ بزن

ali190
سه شنبه 08 فروردین 1391, 01:24 صبح
سلام

Private Function CheckPersonExist(ByVal firstname As String, ByVal lastname As String) As Boolean
Try
cmd = New SqlCommand("Select fname,lname from Table1", cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()
Dim reader As SqlDataReader
reader = cmd.ExecuteReader
Dim value As Boolean = False
While reader.Read
If firstname = reader.GetString(0) And lastname = reader.GetString(1) Then
Return True
Exit While
End If
End While
If value Then
reader.Close()
Return True
Else
reader.Close()
Return False
End If
Catch ex As Exception
cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا هنگام شناسایی رکورد جدید")
End Try
End Function
من متوجه نشدم ، در فورمول بالایی نقش متغیر value چیه
یه مقدار اولیه بهش دادن و بعد همونطوری رها شده
ممنون میشم توضیح بدید
ممنونم
یاعلی

Hybrid
سه شنبه 08 فروردین 1391, 10:55 صبح
سلام ، حق با شماست میتونین حذفش کنین به صورت زیر :


Private Function CheckPersonExist(ByVal firstname As String, ByVal lastname As String) As Boolean
Try
cmd = New SqlCommand("Select fname,lname from Table1", cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()
Dim reader As SqlDataReader
reader = cmd.ExecuteReader

While reader.Read
If firstname = reader.GetString(0) And lastname = reader.GetString(1) Then
Return True
Exit While
End If
End While

reader.close()
cnn.close()
Catch ex As Exception
cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا هنگام شناسایی رکورد جدید")
End Try
End Function

فرید نجفلو
سه شنبه 08 فروردین 1391, 13:07 عصر
اگه دوستان اجازه بدن من یه تغییرات کوچیکی تو تابع بدم:

Private Function CheckPersonExist(ByVal firstname As String, ByVal lastname As String) As Boolean
Try
Dim TSQL As String = "SELECT ISNULL(COUNT(fname),0) FROM Table1" & vbNewLine
TSQL &= String.Format(" WHERE fname = '{0}' AND lname = '{1}'", firstname, lastname)
cmd = New SqlCommand(TSQL, cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()
Dim SqlRes As Integer = CInt(cmd.ExecuteScalar)
cnn.Close()
Return SqlRes = 0
Catch ex As Exception
If cnn.State = ConnectionState.Open Then cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا هنگام شناسایی رکورد جدید")
End Try
End Function

ali190
سه شنبه 08 فروردین 1391, 13:25 عصر
سلام جناب Farid.N
فکر کنم روش شما کارآمد تر باشه
مثلاً فرض کنید در جدولمون 10000 رکورد داریم
در روش اول مجبوریم هر 10000 رکورد خونده بشه و هر جا که Fname و Lname با هم در یک رکورد قرار گرفت حلقه متوقف میشه
اما در روش شما ، با استفاده از مقادیر Fname و Lname شما دقیقاً سروقت همون رکورد میرید.
درسته؟

فرید نجفلو
سه شنبه 08 فروردین 1391, 13:53 عصر
درسته
و یک نکته که شما در تابع اول تا اتمام کل عملیات به پایگاه داده متصل هستید(اتلاف شدید منابع) ولی در تابع دوم یک بار اطلاعات گرفته شده اتصال بسته کار مورد نطرمون رو انجام می دیم
توجه کنید که شاید این موضوع در یک برنامه کوچک رومیزی چنان مشکلی پیش نیاره ولی اگه همین کار رو در یک برنامه ASP.NET که سایت روزانه هزاران درخواست صفحه داره و این وسط هم عملیات روی اطلاعات دریافتی زیاد باشه تبدیل به یک فاجعه میشه!

در ضمن به تعداد خطوط و چیدمان کد ها(دیباگ خیلی راحتر) هم توجه کنید

swallow.pa
شنبه 12 فروردین 1391, 21:09 عصر
اگه دوستان اجازه بدن من یه تغییرات کوچیکی تو تابع بدم:

Private Function CheckPersonExist(ByVal firstname As String, ByVal lastname As String) As Boolean
Try
Dim TSQL As String = "SELECT ISNULL(COUNT(fname),0) FROM Table1" & vbNewLine
TSQL &= String.Format(" WHERE fname = '{0}' AND lname = '{1}'", firstname, lastname)
cmd = New SqlCommand(TSQL, cnn)
If cnn.State = ConnectionState.Closed Then cnn.Open()
Dim SqlRes As Integer = CInt(cmd.ExecuteScalar)
cnn.Close()
Return SqlRes = 0
Catch ex As Exception
If cnn.State = ConnectionState.Open Then cnn.Close()
MsgBox(Err.Description _
, MsgBoxStyle.Critical, "خطا هنگام شناسایی رکورد جدید")
End Try
End Function

با سلام
این کد در صورت ذخیره کردن رکورد جدید کاربرد داره اما برای اصلاح رکورد چیکار باید کرد
ممنون