PDA

View Full Version : حرفه ای: عدد رندوم با مقایسه دیتابیس



teymoorei
جمعه 22 شهریور 1392, 01:14 صبح
سلام
همون طور که از تیتر پیداس من عدد رندوم با مقایسه با اعداد دیتابیس می خوام و میخوام این اعداد بین 10 تا 99 باشه اگه تعدادش بیشتر از این شد دیگه عدد نمایش نده و بگه امکان نمایش نیست .

باتشکر

r. salehi
جمعه 22 شهریور 1392, 09:56 صبح
سلام
میشه منظورتون را بیشتر توضیح بدین؟ من دقیقا متوجه نشدم چه کاری مد نظرتونه.

teymoorei
جمعه 22 شهریور 1392, 10:00 صبح
سلام

ببینید من می خوام اعداد بین 10 تا 99 تولید کنم و توی دیتابیس ذخیره کنم این اعداد باید بدون تکرار باشن یعنی تیبل من ماکسیمم 99 تا رکورد داره برای هر بار ذخیره در جدول باید عدد تصادفی تولید شده با مقادیر جدول مقایسه بشه اگه نبود ذخیره بشه اگه بود باید پیغام بده که جدول شما پر شده .

teymoorei
جمعه 22 شهریور 1392, 11:40 صبح
کسی نیست کمک کنه ؟

r. salehi
جمعه 22 شهریور 1392, 11:57 صبح
سلام مجدد
به نظرم باید از الگوریتم زیر استفاده کنید.
ساختن یک دیتا تیبل
کنترل اینکه تعداد رکوردها 100 عدد شده یا نه
تولید عدد رندوم
کنترل اینکه آیا عدد در دیتا تیبل وجود دارد یا خیر (با استفاده از LINQ)
در صورت عدم وجود عدد تولید شده، عدد به دیتا تیبل اضافه بشه
و ادامه این روند به صورت حلقه وار
نهایتا Update دیتاتیبل در بانک

نباید چیزی جر این باشه درسته؟

teymoorei
جمعه 22 شهریور 1392, 12:15 عصر
میشه نوع فیلد رو int قرار داد و گفت از 10 شروع کن و توی برنامه هم کنترل کرد که به 100 نرسه اما اگه یکی از رکورد ها رو حذف کنیم دوباره نمیاد اونو تولید کنه مثلا اگه عدد 50 حذف بشه دیگه تولیدش نمیکنه .

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

teymoorei
جمعه 22 شهریور 1392, 15:22 عصر
دوستان راهی به نظرتون نمیرسه ؟

teymoorei
جمعه 22 شهریور 1392, 18:49 عصر
من این کد رو نوشتم اما زمانی که تکراریه باید اینقدر کلید رو بزنم تا به یه عدد غیر تکراری برسه :

If DataGridView1.RowCount = 90 Then
MessageBox.Show("Full")
Exit Sub
End If

TextBox1.Text = RNDx(10, 99)
If Connection.State = ConnectionState.Closed Then Connection.Open()
Dim daadap As New SqlDataAdapter("select * from Table10 where Code = '" & TextBox1.Text & "'", Connection)
Dim dt As New DataTable
Dim ds As New DataSet

daadap.Fill(ds, "Table10")
dt = ds.Tables("Table10")
If Connection.State = ConnectionState.Open Then Connection.Close()

If dt.Rows.Count > 0 Then

'MessageBox.Show("تکراری است")

Else

If Connection.State = ConnectionState.Closed Then Connection.Open()
Dim cmd As New SqlCommand("Insert Into Table10 (code) Values (@code)", Connection)

cmd.Parameters.AddWithValue("@code", TextBox1.Text)
If Connection.State = ConnectionState.Closed Then Connection.Open()
cmd.ExecuteNonQuery()
'MessageBox.Show("OK")
DataGridFirst()
Connection.Close()

End If

Alirezanet
شنبه 23 شهریور 1392, 05:29 صبح
سلام
علی جان این روش که ابتدا اعداد را تولید کنید و بعد برید چک کنید که آیا در دیتابیس موجود هست یا نه , روش مناسبی نیست ...
شاید برای 100 تا رکورد با کمی تاخیر به جواب برسی ولی برای مسائل مشابه این روش جالبی نیست ...
پیشنهاد من اینه که یک بار به دیتابیس متصل بشید و کل اطلاعات رو بخونید و در لیست به طور مثال A قرار بدید. بعد لیست B رو از اعداد بین 10 -99 پر کنید . لیست A رو منهای B کنید. در نتیجه لیست B شامل اعدادی میشه که در دیتابیس موجود نیست. بعد بجای خود عدد موجود در لیست , به طور تصادفی از ایندکس های لیست B استفاده کنید و مقدارش رو در دیتابیس قرار بدید.

در این روش هیچ مقدار تکراری تولید نمیشه....

موفق باشی

tooraj_azizi_1035
شنبه 23 شهریور 1392, 12:05 عصر
می تونستید از uniqueidentifier استفاده کنید.

teymoorei
شنبه 23 شهریور 1392, 12:59 عصر
مرسی علیرضا جان

اگه تونستی یه قطعه کد هم بزار

ممنونم tooraj_azizi_1035

اگه میشه بیشتر توضیح بدید

Alirezanet
شنبه 23 شهریور 1392, 16:15 عصر
سلام
کلیت کار به شکل زیره ...

Dim ListA As New List(Of Integer)
Dim ListB As New List(Of Integer)

' ListA = اعداد موجود در دیتابیس در این لیست قرار گیرد

For i = 10 To 99
If ListA.IndexOf(i) = -1 Then
ListB.Add(i)
End If
Next

Dim rndIndex As Integer = RNDx(0, ListB.Count)

Dim NewNumberForAddToDB As Integer = ListB(rndIndex)

صباح فتحی
شنبه 23 شهریور 1392, 16:37 عصر
select * from tbl order by newid
این رکوردهارو بصورت تصادفی میاره

teymoorei
دوشنبه 25 شهریور 1392, 13:22 عصر
آقای صباح فتحی ممنونم از توجه تون اما فکر میکنم شما تاپیک رو درست نخوندید :لبخندساده:

tooraj_azizi_1035
دوشنبه 25 شهریور 1392, 17:09 عصر
شما باید NewID() رو به عنوان مقدار پیش فرض ستون مورد نظر ست کنید:

ALTER TABLE MyTable
ADD CONSTRAINT DefaultColValue DEFAULT NEWID() FOR Column1

teymoorei
سه شنبه 26 شهریور 1392, 09:29 صبح
سلام


شما باید NewID() رو به عنوان مقدار پیش فرض ستون مورد نظر ست کنید:


ALTER TABLE MyTable

ADD CONSTRAINT DefaultColValue DEFAULT NEWID() FOR Column1



اگه ممکنه بیشتر توضیح بدید اصلا متوجه منظور شما نمیشم .

teymoorei
سه شنبه 26 شهریور 1392, 09:50 صبح
این دقیقا همون چیزیه که میخوام .
اما اگه به یه عدد تکراری برسم باید اینقدر کلیک کنم تا به عدد غیر تکراری برسم .
میخوام خودش اگه به عدد تکراری رسید اینقدر سرچ کنه تا به عدد مورد نظر پیدا بشه .

لینک دانلود پروژه من (http://www.uplooder.net/cgi-bin/dl.cgi?key=96d64b15b3fff92af5031ae4cd58856e)

Naghibi
سه شنبه 26 شهریور 1392, 11:30 صبح
فکر کنم این مشکلتون رو حل کنه



If Connection.State = ConnectionState.Closed Then Connection.Open()
Dim daadap As New SqlDataAdapter()
Dim dt As New DataTable
Dim CurrentCode As String = ""
Dim IsNewCode As Boolean = False
While IsNewCode = False
dt.Clear()
CurrentCode = RNDx(10, 99)
daadap = New SqlDataAdapter("select * from Table10 where Code = '" & CurrentCode & "'", Connection)
daadap.Fill(dt)

If dt.Rows.Count = 0 Then
TextBox1.Text = CurrentCode
IsNewCode = True
If Connection.State = ConnectionState.Closed Then Connection.Open()
Dim cmd As New SqlCommand("Insert Into Table10 (code) Values (@code)", Connection)

cmd.Parameters.AddWithValue("@code", TextBox1.Text)
If Connection.State = ConnectionState.Closed Then Connection.Open()
cmd.ExecuteNonQuery()
'MessageBox.Show("OK")
DataGridFirst()
Connection.Close()

End If
End While