PDA

View Full Version : مشکل جستجو در فیلدی با نوع عددی



hqsoroush
چهارشنبه 09 آذر 1390, 09:23 صبح
سلام.
من توی جستجوی اعداد مشکل دارم.
از این کد برای جستجو استفاده میکنم:

dt.DefaultView.RowFilter = "Number Like '" + TextBox8.Text & "%'"

اما هر وقت که یه مقدار عددی وارد کنم این پیغام رو میده:

Cannot perform 'Like' operation on System.Int32 and System.String

چکارش کنم؟
مرسی.

amirzandi
چهارشنبه 09 آذر 1390, 09:48 صبح
شما باید کالمن Number را به String تبدیل کنین.

hqsoroush
چهارشنبه 09 آذر 1390, 10:33 صبح
سلام.

شما باید کالمن Number را به String تبدیل کنین.
میشه بیشتر توضیح بدید که باید چطوری این کار رو انجام بدم؟
کجا باید این تغییرات رو انجام بدم؟توی بانک یا برنامه؟
ممنونم دوست عزیزم.

hqsoroush
چهارشنبه 09 آذر 1390, 12:19 عصر
اگه کسی هم هست که راه حل دیگه ای داره، دریغ نکنه... .:قلب:

ali.hojjati
چهارشنبه 09 آذر 1390, 12:38 عصر
این جوری تایپ کن
برای ستون فیلد های عددی که در بانک داری نیاز به گذاشتن علامت (') قبل و بعد از متغیر نداری. احتمالا به همین دلیل ایراد گرفته.
dt.DefaultView.RowFilter = "Number Like " + TextBox8.Text & "%"

hqsoroush
چهارشنبه 09 آذر 1390, 13:48 عصر
این جوری تایپ کن
برای ستون فیلد های عددی که در بانک داری نیاز به گذاشتن علامت (') قبل و بعد از متغیر نداری. احتمالا به همین دلیل ایراد گرفته.
dt.DefaultView.RowFilter = "Number Like " + TextBox8.Text & "%"

سلام عزیزم.
این کار رو انجام دادم.پیغام خطای زیر رو میده:
Syntax error: Missing Operand after 'Mod' Operator.
چکار کنم؟

ali.hojjati
چهارشنبه 09 آذر 1390, 16:34 عصر
dt.DefaultView.RowFilter = "Number Like " & TextBox8.Text & "%"

ابنو تست کن. من (&) رو با (+) جایگزین کردم

hqsoroush
چهارشنبه 09 آذر 1390, 17:04 عصر
دوست گلم، تستش کردم ولی همون پیغام خطا رو میده.
واقعا نمیدونم چکارش کنم؟
پروژه ی پایانیه.

mgh64120
چهارشنبه 09 آذر 1390, 19:39 عصر
سلام دوست عزيز
براي مقادير عددي بايد از عملگر مساوي استفاده كنيد نه Like

"Number = " & Textbox8.Text

موفق باشيد.

hqsoroush
چهارشنبه 09 آذر 1390, 22:06 عصر
سلام دوست عزيز
براي مقادير عددي بايد از عملگر مساوي استفاده كنيد نه Like

dt.DefaultView.RowFilter = "Number = " & TextBox8.Text

موفق باشيد.

سلام عزیزم.
این کار رو هم انجام دادم؛ به اینصورت:

dt.DefaultView.RowFilter = "Number = '" & TextBox8.Text & "%'"

ولی باز پیغام خطا میده.
البته دابل کوتیشن و سینگل کوتیشین هم دستکاری کردم.حتی بجای (&) از (+) استفاده کردم ولی فایده نداشت.
تورو خدا یکی کمکم کنه.

mgh64120
چهارشنبه 09 آذر 1390, 22:43 عصر
سلام دوست عزيز
آيا شما دستوري كه گذاشتم امتحان كرديد؟چرا اونو تغيير داديد؟
نوع داده(DataType) فيلد Number در بانك اطلاعاتيتون كه عمل فيلتر رو ميخواين روي اون انجام بدين چيه؟
اگر از انواع عددي هست كه بايد مانند نمونه كه قبلا گذاشتم عمل كني و نبايد از ' در اول و %' در آخر دستور استفاده كني. چون اونا فقط براي رشته ها استفاده ميشوند.

"Number = " & TextBox8.Text

موفق باشيد.

tto_baran
پنج شنبه 10 آذر 1390, 06:22 صبح
من احتمال میدم برنامه شما باگ دیگری هم داشته باشد و تا آن را هم رفع نکنی تغییرات اعمال شده جواب نمیده . با این حال یک بار هم بجای textbox8.text شما لطف کنید و val(textbox8.text) . قرار بدهید اگر برنامه باگ دیگری نداشه باشد حتما باید جواب بدهد .

hqsoroush
پنج شنبه 10 آذر 1390, 12:36 عصر
با این حال یک بار هم بجای textbox8.text شما لطف کنید و val(textbox8.text) . قرار بدهید اگر برنامه باگ دیگری نداشه باشد حتما باید جواب بدهد .

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


من احتمال میدم برنامه شما باگ دیگری هم داشته باشد و تا آن را هم رفع نکنی تغییرات اعمال شده جواب نمیده .

خدا نکنه اینطور باشه.
چون دیگه نمیدونم باید چکارش کنم.

meisam3322
پنج شنبه 10 آذر 1390, 13:16 عصر
با سلام دوست عزیز،

یه راهی هست که با DataView بتونی DataTable رو فیلتر کنی بعد هم میتونی Datatable رو Bind کنی.



;([DataView dv = new DataView(ds.Tables[0
;"'dv.RowFilter = "id=1 and firstname='hadi
;Datagrid1.datasource=dv


اینجا رو هم یه نگاهی بنداز (http://www.tebyan.net/index.aspx?pid=17257&threadID=202954)

hqsoroush
پنج شنبه 10 آذر 1390, 22:49 عصر
آيا شما دستوري كه گذاشتم امتحان كرديد؟چرا اونو تغيير داديد؟

سلام.
این کار رو انجام دادم.وقتی مقداری رو که توی جدول هم هست رو جستجو میکنم، دیتا گرید چیزی بهم نشون نمیده(خالی میشه).
وقتی تکست باکسم رو پاک میکنم پیغام خطا میده:
Syntax error: Missing Operand after '=' Operator.


نوع داده(DataType) فيلد Number در بانك اطلاعاتيتون كه عمل فيلتر رو ميخواين روي اون انجام بدين چيه؟

نوع داده این فیلد Int هستش.

مرسی عزیزم.

hqsoroush
پنج شنبه 10 آذر 1390, 23:25 عصر
یه راهی هست که با DataView بتونی DataTable رو فیلتر کنی بعد هم میتونی Datatable رو Bind کنی.

;([DataView dv = new DataView(ds.Tables[0
;"'dv.RowFilter = "id=1 and firstname='hadi
;Datagrid1.datasource=dv



با سلام خدمت دوست عزیزم.
متاسفانه فایده ای نداره.
نمیدونم چرا؟
به هر حال خیلی ممنونم ازتون.اگر راهکار دیگه ای به ذهنتون میرسه، خیلی ممنون میشم که بهم بگید.

hqsoroush
پنج شنبه 10 آذر 1390, 23:34 عصر
دوستان یه چیز جالب!!!
اگر این کد رو بنویسم بهم جواب میده.

dt.DefaultView.RowFilter = " Number = '21' "

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

dt.DefaultView.RowFilter = " Number = 21 "

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

amirdifraxe1
پنج شنبه 10 آذر 1390, 23:38 عصر
دیتاگریتون رو به صورت کد وصل نمایید



Private Sub FillDataSetAndView()
Dim ds As New DataSet
Dim dt As New SqlDataAdapter("SELECT [id]'ردیف',[NameHamkar]'نام',[FamilyHamkar]'نام خانوادگی',[TelHamkar]'تلفن',[AddressHamkar]'آدرس' FROM TarifHamkar", connection)
dt.Fill(ds, "TarifHamkar")
objDataView = New DataView(ds.Tables("TarifHamkar"))
DataGridView1.DataSource = ds
DataGridView1.DataMember = "TarifHamkar"
End Sub



سپس در خصوصیت textchange تکس باکس کد زیر را بنویسید


With Ds.Tables("TarifHamkar")
objDataView.RowFilter = "[نام خانوادگی]like '%" + ToolStripTextBox1.Text + "%' "
DataGridView1.DataSource = objDataView


100% کار می کنه چون خودم تست کردم .
اگه کد بالا خوانا نبود از عکس استفاده کنید

موفق باشید

mgh64120
جمعه 11 آذر 1390, 09:36 صبح
سلام دوست عزيز
براي عمل فيلتر من خودم در SQLServer اين كارو انجام دادم و جواب ميده.البته توسط DataView به اين صورت :

DV.RowFilter = "ShNo = " & Trim(txtSearch.Text)

يه سري به اين تاپيك بزن: http://barnamenevis.org/showthread.php?315166-فیلتر-داده-ها-در-Dataset

و
وقتی تکست باکسم رو پاک میکنم پیغام خطا میده:
Syntax error: Missing Operand after '=' Operator.

در رويداد TextChanges يه دستور If بنويس كه وقتي مقدارش برابر "" شد سپس DV.RowFilter = String.Empty
وقتي مقدار رشته خالي رو به DataView بفرستي، كليه ركوردها رو بر ميگردونه؟

If Trim(TextBox8.Text)=String.Empty Then
DV.RowFilter = String.Empty
End If

اگه باز هم مشكل داشتي بگو تا برات يه برنامه نمونه بذارم.
موفق باشيد.

hqsoroush
جمعه 11 آذر 1390, 16:15 عصر
دیتاگریتون رو به صورت کد وصل نمایید

Private Sub FillDataSetAndView()
Dim ds As New DataSet
Dim dt As New SqlDataAdapter("SELECT [id]'ردیف',[NameHamkar]'نام',[FamilyHamkar]'نام خانوادگی',[TelHamkar]'تلفن',[AddressHamkar]'آدرس' FROM TarifHamkar", connection)
dt.Fill(ds, "TarifHamkar")
objDataView = New DataView(ds.Tables("TarifHamkar"))
DataGridView1.DataSource = ds
DataGridView1.DataMember = "TarifHamkar"
End Sub


سلام دوست خوبم amirdifraxe1.
از راه حل شما استفاده کردم و مشکلم حل شد.فقط یه جاهایی رو تغییر دادم.
اما یه سوال:
من قبلا از طریق(DataTable) میرفتم و Datagrid رو Fill میکردم.ولی شما از طریق DataView این کار رو انجام دادید.
راهی هست که بتونم از طریق DataTable این کار رو انجام بدم؟من که هرکاری کردم، همون نتیجه های قبلی و پیغام خطاهای قبلی رو میداد.
مرسی خیلی لطف کردید.

hqsoroush
جمعه 11 آذر 1390, 16:33 عصر
سلام دوست عزيز
براي عمل فيلتر من خودم در SQLServer اين كارو انجام دادم و جواب ميده.البته توسط DataView به اين صورت :

DV.RowFilter = "ShNo = " & Trim(txtSearch.Text)

يه سري به اين تاپيك بزن: http://barnamenevis.org/showthread.php?315166-فیلتر-داده-ها-در-Dataset

و
در رويداد TextChanges يه دستور If بنويس كه وقتي مقدارش برابر "" شد سپس DV.RowFilter = String.Empty
وقتي مقدار رشته خالي رو به DataView بفرستي، كليه ركوردها رو بر ميگردونه؟

If Trim(TextBox8.Text)=String.Empty Then
DV.RowFilter = String.Empty
End If

اگه باز هم مشكل داشتي بگو تا برات يه برنامه نمونه بذارم.
موفق باشيد.

سلام گلم.
مشکل جستجو حل شد و از کدی که بهم دادی استفاده کردم و پیغام خطای هنگام پاک کردن تکست باس رو برطرف کردم.یعنی پیغام خطا نمیده.
اما رکوردها رو بر نمیگردونه.دیتاگرید، خالی میشه(یا بقول اصفهانیها: پر از خالی میشه)
چکارش کنم؟
یه مشکل دیگه اینه که فرض کن میخوام شماره 21 رو جستجو کنم.2 رو که وارد میکنم دیتاگرید خالی میشه و تا موقعی که 1 رو نزنم، رکورد موردنظرم رو واسم نمیاره.درصورتیکه قبلا اگر 2 رو وارد میکردم تمام رکوردهایی که اولشون 2 داشت رو واسم می آورد.
این رو هم بیزحمت بهم بگید.
مرسی از لطفتون.

mgh64120
جمعه 11 آذر 1390, 19:38 عصر
سلام دوست عزيز


اما رکوردها رو بر نمیگردونه.دیتاگرید، خالی میشه(یا بقول اصفهانیها: پر از خالی میشه)چکارش کنم؟

همونطور كه در پست پيش قبلي توضيح دادم براي اينكه عمل فيلتر رو برداري و كليه ركوردها نمايش داده بشه بايد مقدار DV.RowFilter رو برابر رشته خالي قرار بدي.
اين كد رو توي رويداد textChanged تكست باكس(TextBox8) بزار.

If Trim(TextBox8.Text) = "" Then
DV.RowFilter = ""
Else
DV.RowFilter = "Number = " & TextBox8.Text
End If

و

یه مشکل دیگه اینه که فرض کن میخوام شماره 21 رو جستجو کنم.2 رو که وارد میکنم دیتاگرید خالی میشه و تا موقعی که 1 رو نزنم، رکورد موردنظرم رو واسم نمیاره.درصورتیکه قبلا اگر 2 رو وارد میکردم تمام رکوردهایی که اولشون 2 داشت رو واسم می آورد.

اگر بخواي اون طوري عمل كنه، بايد نوع داده فيلد Number رو از Int به رشته(مثلا در Varchar : SQLServer) تبديل كني و بجاي عملگر = از عملگر Like استفاده كني.
بدين صورت :

DV.RowFilter = "Number Like '%" & TextBox8.Text & "'"

در اينجا چون ميخواي كه اعداد مشابهي كه اولشون 2 هست رو نشون بده بايد % رو اول بزاري.
موفق باشيد.

amirdifraxe1
جمعه 11 آذر 1390, 19:40 عصر
سلام دوست عزيز
براي عمل فيلتر من خودم در SQLServer اين كارو انجام دادم و جواب ميده.البته توسط DataView به اين صورت :

DV.RowFilter = "ShNo = " & Trim(txtSearch.Text)

يه سري به اين تاپيك بزن: http://barnamenevis.org/showthread.php?315166-فیلتر-داده-ها-در-Dataset (http://barnamenevis.org/showthread.php?315166-%D9%81%DB%8C%D9%84%D8%AA%D8%B1-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-%D8%AF%D8%B1-Dataset)

و
در رويداد TextChanges يه دستور If بنويس كه وقتي مقدارش برابر "" شد سپس DV.RowFilter = String.Empty
وقتي مقدار رشته خالي رو به DataView بفرستي، كليه ركوردها رو بر ميگردونه؟

If Trim(TextBox8.Text)=String.Empty Then
DV.RowFilter = String.Empty
End If

اگه باز هم مشكل داشتي بگو تا برات يه برنامه نمونه بذارم.
موفق باشيد.




این کاری که شما کردید یعنی از دستور trim استفاده کردید مشکلی نیست ولی راحت تر اینه که یه ds جدید new کنید کارتون حل می شه ولی درسته .

amirdifraxe1
جمعه 11 آذر 1390, 19:44 عصر
سلام دوست خوبم amirdifraxe1.
از راه حل شما استفاده کردم و مشکلم حل شد.فقط یه جاهایی رو تغییر دادم.
اما یه سوال:
من قبلا از طریق(DataTable) میرفتم و Datagrid رو Fill میکردم.ولی شما از طریق DataView این کار رو انجام دادید.
راهی هست که بتونم از طریق DataTable این کار رو انجام بدم؟من که هرکاری کردم، همون نتیجه های قبلی و پیغام خطاهای قبلی رو میداد.
مرسی خیلی لطف کردید.



دوست عزیز اگر از راه data tabel برید کاره سختی هست یعنی ارزش نداره ولی بر حال من اون کد هم واستون می زارم .

.:: موفق باشید ::.

hqsoroush
شنبه 12 آذر 1390, 09:16 صبح
.mgh64120سلام
درست شد.
البته اینو به Else اضافه کردم:
Datagridview1.datasource=DV


اگر بخواي اون طوري عمل كنه، بايد نوع داده فيلد Number رو از Int به رشته(مثلا در Varchar : SQLServer) تبديل كني و بجاي عملگر = از عملگر Like استفاده كني.
بدين صورت :
1
2
DV.RowFilter = "Number Like '%" & TextBox8.Text & "'"

در اينجا چون ميخواي كه اعداد مشابهي كه اولشون 2 هست رو نشون بده بايد % رو اول بزاري.
موفق باشيد.

یعنی واقعا هیچ راه دیگه ای نداره؟
حتما باید به رشته تبدیل بشه؟
اگه اینطوری باشه که خیلی بد میشه؟
ممنون.

hqsoroush
شنبه 12 آذر 1390, 09:56 صبح
دوست عزیز اگر از راه data tabel برید کاره سختی هست یعنی ارزش نداره ولی بر حال من اون کد هم واستون می زارم .

.:: موفق باشید ::.

خیلی ممنون.لطف میکنید.

mgh64120
شنبه 12 آذر 1390, 15:20 عصر
سلام


یعنی واقعا هیچ راه دیگه ای نداره؟حتما باید به رشته تبدیل بشه؟اگه اینطوری باشه که خیلی بد میشه؟ممنون.

شما حتما نبايد كه نوع داده فيلد Number در جدولت رو به رشته تبديل كني!
مي توني توي دستور SELECT اينكار رو انجام بدي.
به طور مثال :

SELECT CAST(Number AS nvarchar(20)) AS Number FROM <TableName>

يا

SELECT CONVERT(nvarchar(20), Number) AS Number FROM <TableName>

موفق باشيد.

hqsoroush
یک شنبه 13 آذر 1390, 10:19 صبح
مرسی.
تستش میکنم اگه مشکلی بود مطرح میکنم.

ehsanvb
دوشنبه 11 دی 1391, 16:05 عصر
من هم این مشکل رو داشتم با روشی که mgh64120 گفت حل شد مشکلم
ولی چون ستون تکستی میشه سورتش هم به روش تکست میشه یعنی اول مثلا 11 میاد بعد 2 میاد که اون هم با اضافه کردن

order by Convert(int, Number)

به آخرش حل میشه