PDA

View Full Version : سوال: جلو گیری از ذخیره داده تکراری در پایگاه داده



teymoorei
دوشنبه 10 مرداد 1390, 15:52 عصر
سلام
ببخشید این چند روز من زیاد تاپیک میزنم .
سوالم اینه که چطور می تونم قبل از ذخیره ی یک نام از وجود اون آگاه بشم و نگذارم ذخیره بشه .
من یه کد دارم اما نمی دونم چرا کار نمی کنه .
اینم کدم :
If ds.Tables(0).Rows.Count = 0 Then
ExpandablePanel1.Text = "چنین کاربری وجود ندارد"
ExpandablePanel1.Expanded = True
Timer1.Enabled = True
Else
توی سایت هم زیاد گشتم اما به چیز جالبی بر نخوردم .

ali_habibi1384
دوشنبه 10 مرداد 1390, 16:56 عصر
كدي كه نوشتي فقط داخل ديتا ست رو چك ميكنه نه داخل بانكت(داخل پايگاه داده).يه STP بنويس توي SQL كه Count مقدار ورودي مورد نظرت رو بهت بده واسه خروجي. اينجا بصورت Scaler فراخونيش كن ببين چند تا ازش داري اگر خروجي مخالف صفر بود يعني تكراري هستش.

محسن شامحمدی
دوشنبه 10 مرداد 1390, 17:02 عصر
کار سختی نیست.
فیلدی که نباید تکراری باشه رو (در اینجا نام) رو Primary Key می گیری.
فکر کن اسن "محمد" توی بانک وجود داره.
حالا اگر دوباره بخوای اسم "محمد" رو توی بانک ذخیره کنی یک Exception می گیری که با Catch کردن اون می تونی به مقصودت برسی.

teymoorei
دوشنبه 10 مرداد 1390, 17:28 عصر
خوب آقای حبیبی من نمی دونم باید چیکار کنم لطفا کمکم کنید
و اما آقای شاه محمدی من یه فیلد دیگه رو هم کلید اصلی قرار دادم و شاید بخوام ویرایشش کنم .
کمک کنید لطفا

teymoorei
دوشنبه 10 مرداد 1390, 18:54 عصر
کمک کمک کمک لطفا کمک کنید واقعا گیرم .


از مدیر بخش هم تقاضا دارم به دلیل فنی نبودن پست و نداشتن مطلب علمی این پست رو حداقل 24 ساعت حذف نکنند .

alimanam
دوشنبه 10 مرداد 1390, 20:10 عصر
با سلام

میتونی از این نمونه کد استفاده کنی .

Public Class Form1
Private cnnstring As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db.mdb")
Private Function ExistRecord(ByVal fieldname As String) As Boolean
Dim ap As New OleDb.OleDbDataAdapter("Select " & fieldname & " from table1 where " & fieldname & " ='" & txt1.Text & "'", cnnstring)
Dim dt As New DataTable
ap.Fill(dt)
If dt.Rows.Count = 0 Then
Return True
Else
Return False
End If
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ExistRecord("fname") Then
MsgBox("کاربری با این نام یافت نشد", MsgBoxStyle.Information)
Else
MsgBox("کاربری با این نام قبلا ثبت شده است", MsgBoxStyle.Exclamation)
End If
End Sub
End Class

موفق باشید ./

teymoorei
دوشنبه 10 مرداد 1390, 21:16 عصر
سلام
ممنون اما fieldname چیه ؟
بعدشم چطور باید از این کد استفاده کنم ، منظورم اینه که کد ذخیره رو کجای اون شرط باید بزارم ؟

teymoorei
دوشنبه 10 مرداد 1390, 21:35 عصر
کمک کنید لطفا فردا صبح باید پروژه رو تحویل بدم .:گریه::گریه:


ساعت 12:00 شد واقعا کسی نیست کمک کنه ؟

alimanam
دوشنبه 10 مرداد 1390, 23:58 عصر
ممنون اما fieldname چیه ؟ای بابا ! خوب معلومه دیگه نام فیلدی هست که دارم عمل جستجو رو براساس اون انجام میدم تا ببینم همچین رکوردی در جدول وجود داره یا نه !


بعدشم چطور باید از این کد استفاده کنم ، منظورم اینه که کد ذخیره رو کجای اون شرط باید بزارم ؟

برات یه نمونه نوشتم ازش کمک بگیر .

موفق باشید ./

teymoorei
سه شنبه 11 مرداد 1390, 12:39 عصر
سلام
باتشکر از alimanam اما بازم کار نکرد نمی دونم چرا ؟
خواهشا کمک کنید بعد از ظهر باید پروژه رو تحویل بدم .
کارم خیلی خیلی گیره .

Behzad_MCP
سه شنبه 11 مرداد 1390, 12:59 عصر
Public Sub AddNewBank(ByVal Bname As String)

BankName = Bname


Dim da As New SqlDataAdapter("SELECT * FROM Cheques.Banks", frmMain.cnMain)


Dim ds As New DataSet

da.Fill(ds,
"Banks")

BankExistance =
False


For i As Integer = 0 To ds.Tables(0).Rows.Count - 1


If BankName = ds.Tables(0).Rows.Item(i).Item(1).ToString Then

BankExistance =
True

MyBoxError(
" ╚╟╘╧" & vbCrLf & " ╟╙╩▌╟╧ف ءغ", " ")


Exit Sub


End If


Next


If Not BankExistance Then


Dim row As DataRow = ds.Tables(0).NewRow

row(
"BankName") = BankName

row(
"ModifiedDate") = Date.Now

ds.Tables(
"Banks").Rows.Add(row)


Dim scb As New SqlCommandBuilder(da)

da.Update(ds,
"Banks")

MyBoxInformation(
" ", " ")


End If


End Sub

توجه داشته باش که bankName غث پراپرتی که موقع مقدار دهی گرفته میشه

mmd2009
سه شنبه 11 مرداد 1390, 13:04 عصر
با سلام

دوست عزیز کدهایی که اقای alimanam گذاشتن درسته.

شما کافیه قبل از هر بار که میخوای یک رکورد رو ثبت بکنی چک کنی ببینی ایا قبلا تو بانک به همچون اسمی رکوردی قبلا گذاشته شده یا نه و مطمئنا مقدار true یا False برمی گرده دقیقا مطل متدی که دوستمون نوشتن حالا طریقه استفادش رو هم که توضیح دادن. من مطمئما اگر جوابی نداده احتمال زیاد اشتباه از کدهای شماست. شما کدهای خودتون رو بطور کامل و دقیق اینجا بذارید که دوستان بتونن به شکل واضح تری جوابتون رو بدن طبق چیزی که خودتون رفتید جلو.

موفق باشید

teymoorei
سه شنبه 11 مرداد 1390, 13:14 عصر
سلام
من هم این روش رو استفاده کردم :
Connection.Open()
ad = New SqlDataAdapter("select * from Table1 where Catgory='" & TextBox1.Text & "'", Connection)
Dim ds2 As New DataSet
ad.Fill(ds2, "Table1")
If ds2.Tables(0).Rows.Count = 0 Then

Dim cmd As New SqlCommand("Insert into Table1 (Catgory) Values(@p1)", Connection)
cmd = New SqlCommand("IF EXISTS(SELECT * FROM yourTableName WHERE id=@id) SELECT 1 ELSE SELECT 0", Connection)
If Connection.State = ConnectionState.Closed Then Connection.Open()
With cmd
.Parameters.Clear()
.Parameters.AddWithValue("@p1", TextBox1.Text.Trim)
.ExecuteNonQuery()
End With

ElseIf ds2.Tables(0).Rows.Count <> 0 Then
ExpandablePanel1.Text = "نام کاربر تکراری است"
ExpandablePanel1.Expanded = True
Timer1.Enabled = True
Exit Sub

End If
هم این روش :

If ExistRecord("Catgory") Then
If Connection.State <> ConnectionState.Open Then
Connection.Open()
Dim cmd As New SqlCommand("Insert into Table1 (Catgory) Values(@p1)", Connection)
If Connection.State = ConnectionState.Closed Then Connection.Open()
With cmd
.Parameters.Clear()
.Parameters.AddWithValue("@p1", TextBox1.Text.Trim)
.ExecuteNonQuery()
End With
'ExpandablePanel1.Expanded = True
'ExpandablePanel1.Text = "اطلاعات با موفقيت ذخيره شد"
'Timer1.Enabled = True
TextBox1.Clear()
'Connection.Close()
MsgBox("شخص مورد نظر با موفقيت ثبت شد", MsgBoxStyle.Information)
Else
MsgBox("فردي با نام وارد شده قبلاً درپايگاه داده ثبت شده است", MsgBoxStyle.Exclamation)
End If

البته در مورد کد دوم هر بار که فرم رو باز می کنم بار اول کار نمی کنه دوباره که وارد می کنم جلوگیری میکنه ولی باز فرم رو که می بندم باز روز از نو و روزی از نو :متفکر:

تازه هر کدوم رو هم کلی دست کاری کردم بازم نشد .
کمک کنید لطفا دارم دیونه میشم به خدا .:گریه:

Behzad_MCP
سه شنبه 11 مرداد 1390, 13:31 عصر
ببین تیموری جان کد اولت درسته باید کار کنه فقط دیگه ElseIf نذار Else بذار با BreakPoint چک کن ببین چه اتفاقی میفته

teymoorei
سه شنبه 11 مرداد 1390, 13:40 عصر
نمیشه نمیشه نمیشه بابا نمیشه به خدا نمیشه اح .

asefy2008
سه شنبه 11 مرداد 1390, 13:48 عصر
اول این رو بگم که من اصلا vb کار نکردم .
نگاه کن دوست عزیز یه چیزی میگم ولی ناراحت نشو (البته من نمی دونم شما رو چی کار می کنی شاید اشتباه کنم )
معمولا این گونه مشکلات زمانی به وجود میاد که شما تحلیل درستی از اون چیزی که میخوای پیاده کنی انجام ندادی. این راه حل هایی که دوستان گفتن مقطعی هست و در بلند مدت و در برنامه های بزرگتر شما رو دچار مشکل می کنه. البته شما با این وقت کم چاره دیگه ای ندارید.

موفق باشید.

teymoorei
سه شنبه 11 مرداد 1390, 13:58 عصر
ممنون از توجه تون با این تاپیک و برنامه ی من .

teymoorei
سه شنبه 11 مرداد 1390, 14:14 عصر
آقا واقعا دست همگی درد نکنه خیلی زحمت کشیدید ، من دیگه بی خیال این موضوع شدم این سومین سواله که این اتفاق میوفته .
خدانگهدار

alimanam
سه شنبه 11 مرداد 1390, 18:12 عصر
با سلام

یعنی چی نمیشه مگه میخوای آپولون هوا کنی عزیز !!! این هم همون سورس با پایگاه داده SQL شما دقیقا همین کد رو کپی پست کن چون دیتابیسش عین جدول شماست !

Imports System.Data.SqlClient
Public Class Form1
Private connection As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\db.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
Private Function ExistRecord(ByVal fieldname As String, ByVal tablename As String) As Boolean
Dim ap As New SqlDataAdapter("Select " & fieldname & " from " & tablename & " where " & fieldname & " = N'" & TextBox1.Text & "'", connection)
Dim dt As New DataTable
ap.Fill(dt)
If dt.Rows.Count = 0 Then
Return True
Else
Return False
End If
End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If ExistRecord("Catgory", "table1") Then
Dim cmd As New SqlCommand("Insert into table1(Catgory) Values (@Catgory)")
cmd.Connection = connection
If connection.State = ConnectionState.Closed Then connection.Open()
With cmd
.Parameters.Clear()
.Parameters.AddWithValue("@Catgory", TextBox1.Text)
.ExecuteNonQuery()
End With
MsgBox("شخص مورد نظر با موفقیت ثبت شد", MsgBoxStyle.Information)
Else
MsgBox("فردی با نام وارد شده قبلاً درپایگاه داده ثبت شده است", MsgBoxStyle.Exclamation)
End If
End Sub
End Class

موفق باشید ./

ahmadreza517
چهارشنبه 26 مرداد 1390, 20:08 عصر
سلام دوست عزیز
به آدرس زیر سر بزن حتما جوابتو می گیری
http://howprg.blogfa.com/post-11.aspx (http://howprg.blogfa.com/post-11.aspx)

73958

به فرم FrmAdd برو و تابع Check رو نگاه کن

نمونه کد :




PrivateSub Check()
Try
If txtNumFact.Text = ""Or txtNameCustomer.Text = ""Then
MsgBox("شماره فاکتور و نام مشتری را وارد نمائید", MsgBoxStyle.ApplicationModal, "")
ExitSub
EndIf
If IsNumeric(txtNumFact.Text) = FalseThenExitSub
Dim i AsInteger
Dim con AsNew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & My.Application.Info.DirectoryPath & "\db.mdb")
Dim command AsNew OleDbCommand("Select * From Tbl_db Where NumFact=@NumFact", con)
command.Parameters.AddWithValue("@NumFact", txtNumFact.Text)
Dim dr As OleDbDataReader
con.Open()
dr = command.ExecuteReader
While dr.Read
i = dr("NumFact")
EndWhile
If i > 0 Then
MessageBox.Show("عدد وارد شده تکراری است" + vbCrLf + "عدد دیگری را امتحان کنید", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
con.Close()
dr.Close()
ExitSub
EndIf
con.Close()
dr.Close()



Call ADD()
Catch ex As Exception
MsgBox(ex.Message)
ExitSub
EndTry
EndSub
PrivateSub ADD()
Application.DoEvents()
Dim strDate AsString = mskDate.Text
If ChDate.Checked = TrueThen
strDate = MdlDate.DateShamsi
EndIf
Try
Dim c AsNew OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & My.Application.Info.DirectoryPath & "\db.mdb")
Dim D_add AsNew OleDbDataAdapter
Dim g AsString = cmbGroup.Text
Dim M AsString = cmbMonth.Text

Dim co AsNew OleDbCommand("INSERT INTO Tbl_db(NumFact,NameCustomer,City,Masoolpey,MasoolN asb,[Month],[Group],Adr,Mobile,Tell,[Date],other)Values(@NumFact,@NameCustomer,@City,@Masool pey,@MasoolNasb,@Month,@Group,@Adr,@Mobile,@Tell,@ Date,@other)", c)

co.Parameters.AddWithValue("NumFact", txtNumFact.Text)
co.Parameters.AddWithValue("NameCustomer", txtNameCustomer.Text)
co.Parameters.AddWithValue("City", txtCity.Text)
co.Parameters.AddWithValue("Masoolpey", txtMasoolPey.Text)
co.Parameters.AddWithValue("MasoolNasb", txtMasoolNasb.Text)
co.Parameters.AddWithValue("Month", cmbMonth.Text)
co.Parameters.AddWithValue("Group", cmbGroup.Text)
co.Parameters.AddWithValue("Adr", txtadr.Text)
co.Parameters.AddWithValue("Mobile", txtmobile.Text)
co.Parameters.AddWithValue("Tell", txtTell.Text)
co.Parameters.AddWithValue("Date", strDate)
co.Parameters.AddWithValue("other", txtOther.Text)
c.Open()
co.ExecuteNonQuery()
c.Close()
MessageBox.Show("اطلاعات با موفقیت در بانک اطلاعاتی ثبت شد", "", MessageBoxButtons.OK, MessageBoxIcon.Information)

Catch ex As Exception
MsgBox(ex.Message)
EndTry

txtNumFact.Text = ""
txtadr.Text = ""
txtCity.Text = ""
txtMasoolNasb.Text = ""
txtMasoolPey.Text = ""
txtmobile.Text = ""
txtNameCustomer.Text = ""
txtOther.Text = ""
txtTell.Text = ""
mskDate.Text = ""
cmbGroup.SelectedIndex = 0
cmbMonth.SelectedIndex = 0

txtNumFact.Focus()

EndSub

oliya24
چهارشنبه 26 مرداد 1390, 23:25 عصر
این همه دردسر واسه چیییییییییییییییی؟ شما میتونید در هنگام طراحی بانک اطلاعاتی اون فیلد رو یونیک کنید خیلی هم سادست من یه کد از خود اس کیو ال میگذارم

create table n(name nvarchar(22)null,unique(name))
دستور unique یک کلید فرعی میباشد که از ورود داده های تکراری جلوگیری میکند برای فیلدهایی مثل نام ما نباید انها رو از نوع کلید اصلی بگذاریم
این در جواب دوست عزیزم که گفته بودن میتونید این فیلد رو کلید اصلی قرار دهید میشه اما تا کلید فرعی هست چرا بریم سراغ کلید اصلی؟؟؟؟؟؟؟؟؟؟؟
امیدوارم ناراحت نشده باشید
موفق باشید

ahmadreza517
پنج شنبه 27 مرداد 1390, 12:11 عصر
سلام دوست عزیز به آدرس زیر سری بزن (پروژه کامل هست) به قسمت (جدید) پروژه رفته (شماره فاکتور نمی تواند تکراری باشد)
http://howprg.blogfa.com/post-11.aspx (http://howprg.blogfa.com/post-11.aspx)