PDA

View Full Version : جستجوی دو عبارت در بانک sql



omid85m
یک شنبه 31 اردیبهشت 1391, 13:46 عصر
سلام خدمت همه مهندسای گل

من یه بانک اطلاعاتی دارم با دو فیلد optor و optol با اطلاعاتی مثل 10/10 و نرمال و 8/10 و ....
و یه فرم جستجو دارم که دو تا تکست باکس داره

میخوام از بانک اطلاعاتیم اون رکورد هائی رو برام بیاره که تو optor و optol برابر نرمال هستن


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

و نتیجه به من اطلاعاتی رو بده که در هر دو فیلد برابر نرمال قرار گرفتن

میدونم سادست ولی با سرچ نتیجه نگرفتم
ممنون

M.KH-SH
یک شنبه 31 اردیبهشت 1391, 14:45 عصر
select * from tb_normal where optor='normal' and optol='normal'

omid85m
یک شنبه 31 اردیبهشت 1391, 15:17 عصر
ممنون از جوابتون

ولی همیشه دنبال نرمال نیستم ، میخوام تکست باکس 1 و 2 به عنوان شرط باشن

کد خودم اینه

.SelectCommand.CommandText = "Select * FROM " & TableName & " Where " & FieldName & " like '%" & TextBox1.Text & "%'"

ولی میخوام دو شرطی کنمش
یعنی شرط اول رو از تکست باکس1 بخونه و شرط دوم رو از تکست باکس2

فرید نجفلو
یک شنبه 31 اردیبهشت 1391, 17:09 عصر
سلام:

.SelectCommand.CommandText = "Select * FROM " & TableName & " Where " & _
FieldName1 & " like '%" & TextBox1.Text & "%' AND " & _
FieldName2 & " like '%" & TextBox2.Text & "%'"

M.KH-SH
یک شنبه 31 اردیبهشت 1391, 19:08 عصر
دوست عزیز فقط کافی هستش اون جاهای که میخوای متغییر باشن رو با تکست باکس پرکنی مثل کد فرید جان و اگه میخوای چند شرطی باشه هم از and و یا or بسته به نوع کوئری که نیاز داری استفاده کن



یا میتونی از متغییر ها در کوئریت استفاده کنی و با command ها متغییر ها رو پرکنی و جواب رو به نمایش بزاری

راه برای این موارد زیاد هستش

برنامه نویسی بیشتر ابتکار عمل هستش وگرنه برای انجام دادن یک مسئله هزار راه وجود داره که همشم به یک جواب میرسن

omid85m
دوشنبه 01 خرداد 1391, 07:29 صبح
ممنون از جواب هاتون
واقعیت نتونستم جورش کنم

فکر کنم کد خودم رو بزارم راحت تر بشه کمکم بکنید

من از تابع search استفاده کردم به این صورت

Function Search(ByVal FieldName As String, ByVal TableName As String) As DataTable

CN.ConnectionString = cs
With SqlAdapt
.SelectCommand = New SqlCommand()
.SelectCommand.Connection = CN
.SelectCommand.CommandType = Data.CommandType.Text
.SelectCommand.CommandText = "Select * FROM havades " & TableName & " Where " & FieldName & " like '%" & TextBox1.Text & "%'"
If .SelectCommand.Connection.State <> ConnectionState.Open Then
.SelectCommand.Connection.Open()
End If
.SelectCommand.ExecuteNonQuery()
Dim dt As New DataTable
SqlAdapt.Fill(dt)
Return dt

End With
End Function

و بعد در کد دکمه جستجو این رو قرار دادم

Private Sub searchbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles searchbtn.Click

If ComboBox2.SelectedIndex = 0 Then
Form1.dg1.DataSource = Search("name", "havades")
End If
If ComboBox2.SelectedIndex = 1 Then
Form1.dg1.DataSource = Search("mah", "havades")
End If
If ComboBox2.SelectedIndex = 2 Then
Form1.dg1.DataSource = Search("tarikh", "havades")
End If

End Sub

ولی حالا که میخوام دو شرطیش کنم نمی شه

مثلا تو تکست باکس1 ماه مثلا آبان رو بنویسم و تو تکست باکس 2 مکان رو مثلا سالن 1
بعد از جستجو بهم از بانک اطلاعاتی رو بده که ماهش آبان هست و مکانش سالن 1

Hybrid
دوشنبه 01 خرداد 1391, 09:24 صبح
سلام دوست عزیز ، شما خوب اسم table رو نوشتین چرا اسم تیبل رو پارامتری نوشتین یعنی 2 بار تکرار میشه دقت کنید :

نوشتین Select * from havades &tablename خوب دوباره اومدین اسم تیبل رو فرستادین به تابع سرچ یعنی اینجوری میشه :

Select * from havades havades یعنی 2 بار تکرار میشه اگه اسم تیبل ثابت هست و تیبل دیگه ای ندارین اون پارامتر مربوط به tablename رو پاک کنید.

واسه دو شرطی هم دوستان کدش رو نوشتن

omid85m
دوشنبه 01 خرداد 1391, 09:39 صبح
البته table زیاد هست تو بانک اطلاعاتی این یکیشه
پاکش میکنم اگر ارور نده

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

مثلا تو کد خط اول دکمه فقط از فیلد name میخونه که دو شرطی بودنش اونوقت زیر سوال میره
چون طبق مثال من به فیلد مکان هم احتیاج دارم

Hybrid
دوشنبه 01 خرداد 1391, 09:48 صبح
شما میتونین آرایه ای از fieldname ها رو بفرستین تا مشکلی پیش نیاد . مثلا خانه اول فیلد نام باشه و خانه دوم فیلد نام خانوادگی و به همین ترتیب.

چیزه خاصی نداره تا کدش رو واستون قرار بدم . فقط در مورد ارسال آرایه به زیربرنامه یه کم جستجو کن تا به نتیجه برسین.

omid85m
دوشنبه 01 خرداد 1391, 13:15 عصر
ممنون از شما
من کد رو به این شکل تغییر دادم و مشکلم حل شد

Function Search(ByVal FieldName As String, ByVal FieldName1 As String, ByVal TableName As String) As DataTable
CN.ConnectionString = cs
With SqlAdapt
.SelectCommand = New SqlCommand()
.SelectCommand.Connection = CN
.SelectCommand.CommandType = Data.CommandType.Text
.SelectCommand.CommandText = "Select * FROM " & TableName & " Where " & _
FieldName & " like '%" & TextBox1.Text & "%' AND " & _
FieldName1 & " like '%" & TextBox2.Text & "%'"
If .SelectCommand.Connection.State <> ConnectionState.Open Then
.SelectCommand.Connection.Open()
End If
.SelectCommand.ExecuteNonQuery()
Dim dt As New DataTable
SqlAdapt.Fill(dt)
Return dt

End With

End Function

و برای دکمه

Private Sub searchbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles searchbtn.Click

If ComboBox2.SelectedIndex = 0 Then
Form1.dg1.DataSource = Search("name", "makan", "havades")
End If
If ComboBox2.SelectedIndex = 1 Then
Form1.dg1.DataSource = Search("mah", "makan", "havades")
End If
If ComboBox2.SelectedIndex = 2 Then
Form1.dg1.DataSource = Search("tarikh", "makan", "havades")
End If

End If

ولی حالا به یه مشکل دیگه برخوردم

وقتی یکبار سرچ میکنم همه چی درسته اما برای بار دوم میگه که کانکشن استرینگ باز هست و نمی تونی تغییری بدی
cn.close رو به انتهای تابع سرچ اضافه کردم اما نشد

کد دیگه ای هست بابت بستن استرینگ ؟

Hybrid
دوشنبه 01 خرداد 1391, 13:19 عصر
در خط آخر(خط نوزدهم) تابع Search کد زیر رو اضافه کن :

cn.close()

omid85m
دوشنبه 01 خرداد 1391, 13:46 عصر
یعنی بعد از end function ??
من قبل از end function گذاشتم منتها بسته نمیشه و وقتی دوباره سرچ میکنم این ارور رو برای خط اول بهم میده

Not allowed to change the 'ConnectionString' property. The connection's current state is open.

Hybrid
دوشنبه 01 خرداد 1391, 14:09 عصر
ببخشید اصلا حواسم نبود ساختار تابع به شکلی هست که تا قبل از Returnدستورات رو اجرا میکنه و بعد از Return رو اصلا اجرا نمیکنه یعنی cn.close اجرا نمیشه پس cn.close رو cut کن و قبل از خط return dt بزار به احتمال 99 درصد درست میشه.

omid85m
سه شنبه 02 خرداد 1391, 08:41 صبح
ببخشید اصلا حواسم نبود ساختار تابع به شکلی هست که تا قبل از Returnدستورات رو اجرا میکنه و بعد از Return رو اصلا اجرا نمیکنه یعنی cn.close اجرا نمیشه پس cn.close رو cut کن و قبل از خط return dt بزار به احتمال 99 درصد درست میشه.

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