# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  مشکل در جستجو با حرف (ی)

## mahyar-m

دوستان عزیز خسته نباشید 
من دارم یه پروژه می نویسم که یه مشکل داره تو جستجو و اونم اینه که تو تکست که یه نامو یعنی اسمو می گیره تا موقعی که حرف ی رو وارد نکرده داخل گرید اطلاعات فیلتز شده رو نمایش میده اما به محض ورود حرف ی همه اطلاعات داخل گرید خالی میشه و هیچی نشون نمیده . دیتا بیسم sql 2000 و با C#‎ کار میکنم اینم کدی که نوشتم .


DataSet ds11 = newDataSet();
dap.SelectCommand = newSqlCommand();
dap.SelectCommand.Connection = connect;
dap.SelectCommand.CommandText = "select " +
"sabt.id,ltrim(rtrim(sabt.name))+' '+ltrim(rtrim(sabt.family)),sefareshat.codes," +
"sefareshat.mozos,sefareshat.tedads,sefareshat.tar  ikhss," +
"sefareshat.tarikhts,sefareshat.mablaghbs,sefaresh  at.mablaghkols" +
",sefareshat.tozihats,sefareshat.tahvils " +
"from sefareshat " +
"inner join sabt" +
" on sabt.id=sefareshat.id" +
" where sabt.family like '%" + textBoxX86.Text + "%' and sabt.name like '%" + textBoxX15.Text +
"%' and sefareshat.codes like '%" + textBoxX82.Text + "%'";
connect.Open();
dap.Fill(ds11, "code10");
SqlDataReader fdr = dap.SelectCommand.ExecuteReader();
dataGridViewX2.DataSource = ds11;
dataGridViewX2.DataMember = "code10";
dataGridViewX2.AutoGenerateColumns = true;
dataGridViewX2.Columns[0].HeaderText = "کد مشتری";
dataGridViewX2.Columns[1].HeaderText = "سفارش دهنده";
dataGridViewX2.Columns[2].HeaderText = "كد سفارش";
dataGridViewX2.Columns[3].HeaderText = "موضوع";
dataGridViewX2.Columns[4].HeaderText = "تعداد";
dataGridViewX2.Columns[5].HeaderText = "تاريخ سفارش";
dataGridViewX2.Columns[6].HeaderText = "تاريخ تحويل";
dataGridViewX2.Columns[7].HeaderText = "بيعانه";
dataGridViewX2.Columns[8].HeaderText = "مبلغ كل";
dataGridViewX2.Columns[9].HeaderText = "توضيحات";
dataGridViewX2.Columns[10].HeaderText = "تحويل داده شده";
connect.Close();


توضیح در مورد کد :
خیلی واضحه من چند تا جدول رو join کردم و اون 3 تا باکس هم یکیش مقدار ورودیش کد سفارش یکی نام و دیگری فامیل مشکل از جوینم نیست چون بدون جوین هم که تست کردم این مشکل باز هم بود . ممنون میشم کسی راهنمایم کنه چون خیلی مسئله حیاتیه

----------


## mohammad diba

با سلام
من هم همین مشکل رو دارم البته می دونم که به خاطر فارسی ساز نصب شده ویندوزه- البته من با (ک) هم مشکل دارم . اگه کسی برای حل این مشکل راه حلی داره ممنون می شم بگه.

----------


## rnm123

دوستان عزیز این مشکل به علت تفاوت حرف ی در زبان عربی و فارسی و تعدد حالتهای این حرف است . برای حل این مشکل یا باید بانک خود را آپدیت کنید و یا یک روش راحتتر این است که وقتی در جستجوی شما حرف ی به میان آمد در رشته خود پیمایش کنید و کلیه حرفهای ی موجود را با یک حرف ی ( که آنرا با کد اسکی اش معرفی و انتخاب میکنید ) تعویض کنید و با همین حرف ی اطلاعات را سرچ و یا ذخیره کنید به عبارتی دیگر وقتی اطلاعاتی را میخواهید در بانکتان بریزید ابتدا آنرا با یک تابعی که برای منظور فوق تعریف کرده اید پیمایش کنید و حرفهای ی موجود را با حرف ی مخصوص و مشخص شده ( توسط کد اسکی) تعویض کنید و سپس در بانکتان ذخیره کنید و در هنگام جستجو هم برعکس .
البته اگر بانکتان در  sql   باشد با انتخاب Collation مناسب (Arabic_CI_AS) فکر کنم مشکتان حل شود و یک موضوع دیگر هم این که اگر ذخیره و جستجوی اطلاعات در یک سیستم انجام شود مشکلی وجود نخواهد دشات تازمانی که ویندوز آن تعویض شود .

----------


## zoofa

سلام دوستان
برای رفع این مشکل در همه ی فرم های پروژتان keypreview = true قرار دهید و کد زیر را در رویداد keypress فرمتان اضافه کنید تا هم در زمان ثبت کردن اطلاعات و هم در زمان جستجو و کلاً در همه ی زمانها وقتی ی و ک عربی وارد کرد به ی و ک فارسی تبدیل شود و وارد بانک شود


در vb:

 
If e.KeyChar = "ي"Then
e.KeyChar = "ی"
EndIf
If e.KeyChar = "ك"Then
e.KeyChar = "ک"
EndIf




در C#‎


if (e.KeyChar == 'ي') e.KeyChar = 'ی';
if (e.KeyChar == 'ك') e.KeyChar = 'ک'; 

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

----------


## mahyar-m

مرسی از جوابتون دوست عزیز 
میشه بیشتر توضیح بدید دقیقا این  keypreview رو کجا true کنم >

----------


## mahyar-m

دوست عزیز من یادمه دز دیتابیس از چنین چیزی Arabic_CI_AS استفاده می کردیم ولی کجاشو یادم نیست اگه میشه یه توضیح بدید که این Collationو باید به کجای دیتا بیس alter کنم . ضمن اینکه اگر بشه با یه مثال توضیح بدید خیلی ممنون میشم .

----------


## zoofa

سلام دوست عزيز
براي true كردن keypreview فقط كافي است كه فرم خود را انتخاب كنيد و در پنجره‌ي مشخصات فرم keypreview را پيدا كرده و مقدار آن را برابر true قرار دهيد 
و يا در رويداد فرم لود فرمتان form_load مد زير را بنويسيد:


Me.KeyPreview = True

----------


## rnm123

> دوست عزیز من یادمه دز دیتابیس از چنین چیزی Arabic_CI_AS استفاده می کردیم ولی کجاشو یادم نیست اگه میشه یه توضیح بدید که این Collationو باید به کجای دیتا بیس alter کنم . ضمن اینکه اگر بشه با یه مثال توضیح بدید خیلی ممنون میشم .


دوست عزیز کافی است در محیط sql managment روی نام دیتابیس راست کلیک کرده و properties  را انتخاب کنبد از ستون سمت چپ options را انتخاب کنید و در موارد ظاهر شده در سمت راست میتوانید حالت  Arabic_CI_AS را انتخاب کنید

----------


## afsharm

> البته اگر بانکتان در  sql   باشد با انتخاب Collation مناسب (Arabic_CI_AS) فکر کنم مشکتان حل شود و یک موضوع دیگر هم این که اگر ذخیره و جستجوی اطلاعات در یک سیستم انجام شود مشکلی وجود نخواهد دشات تازمانی که ویندوز آن تعویض شود .


تغییر Collation نمی‌تواند این مشکل را حل کند. Collation روی مسائلی مثل نحوه سورتینگ (order by) و رفتار بعضی توابع استرینگی داخل خود SQL تاثیر می‌گذارد. 

همه راه حل‌های ارائه شده مشکل جستجو را حل می‌کنند ولی راه حل جامع آن استفاده از «جستجوی هم ارز» است. این روش جستجو در متون «یونیکد» به خوبی توضیح داده شده‌اند و منظور از آن این است که در جستجو بین حالات مختلف حرف «ی» تفاوتی قائل نشویم. مثلا همه حروف «ی، ي، ئ، ى» که چهار کد یونیکد متفاوت دارند یکی در نظر گرفته شوند. به عنوان مثال دیگر می‌توان «ک، ك» که اولی فارسی و دومی عربی است را عنوان کرد. اگر کمی دقت کنید جستجوی هم ارز در گوگل به خوبی استفاده می‌شود. در گوگل فرقی ندارد که به دنبال «ایرانی» بگردید یا «ايراني»، گوگل همه نتایج مشابه را به شما نشان می‌دهد.

----------


## mahyar-m

دوستان عزیز از همتون ممنونم ولی مشکل من هنوز حل نشده !!!

من هم از colltion arabic استفاده کردم هم از جایگزینی اما متاسفانه بازم جواب نداد تو هر ویندوزی هم که بگین چک کردم بازم نشد که بگیم مشکل از فارسی ساز باشه یا از ویندوز . نمیدونم باید چی کار کنم .

میشه دز مورد جستجوی هم ارز بیشتر توضیح بدید یا حداقل یه منبعی یا تیکه کدی یا سمپلی چیزی بدین .

خیلی ممنون از همتون که وقت میذارین و پاسخ سئوال من رو میدید .

----------


## newgoldenman

> دوستان عزیز از همتون ممنونم ولی مشکل من هنوز حل نشده !!!
> 
> من هم از colltion arabic استفاده کردم هم از جایگزینی اما متاسفانه بازم جواب نداد تو هر ویندوزی هم که بگین چک کردم بازم نشد که بگیم مشکل از فارسی ساز باشه یا از ویندوز . نمیدونم باید چی کار کنم .
> 
> میشه دز مورد جستجوی هم ارز بیشتر توضیح بدید یا حداقل یه منبعی یا تیکه کدی یا سمپلی چیزی بدین .
> 
> خیلی ممنون از همتون که وقت میذارین و پاسخ سئوال من رو میدید .


سلام دوست عزیز

توی كدی كه نوشتی، اگه بدین صورت عمل كنی، ایشالا مشكلت حل میشه:
where sabt.family like N'%" + textBoxX86.Text + "%'

با تشكر از آقای مداح

موفق باشید.

----------


## afsharm

> من هم از colltion arabic استفاده کردم هم از جایگزینی اما متاسفانه بازم جواب نداد تو هر ویندوزی هم که بگین چک کردم بازم نشد که بگیم مشکل از فارسی ساز باشه یا از ویندوز . نمیدونم باید چی کار کنم .


 بهتره کارتون را دیباگ کنید. هم برنامه سی‌شارپ را و هم Queryهای ارسالی به SQL Server را. برای دیباگ برنامه دات نت ببینید در هر مرحل چه کاراکتری در متغیرها ذخیره، دریافت یا ارسال می‌شه. برای Queryها هم از SQL Server Profiler استفاده کنید.
خود من در یک موقعیت مشابه برای آنکه بفهمم هر کاراکتری دققیقا کدام حرف یونیکد است، کد اسکی و هگز آن چیست، شکل آن در فونت‌های مختلف چیست و اسم رسمی آن در یونیکد چیست مجبور شدم یک برنامه ریزه میزه بنویسم. ممکنه این برنامه هم به دردت بخوره. آدرسش اینه: http://fardis.codeplex.com/
-------



> میشه دز مورد جستجوی هم ارز بیشتر توضیح بدید یا حداقل یه منبعی یا تیکه کدی یا سمپلی چیزی بدین .


پیاده سازی جستجوی هم ارز کار ساده‌ای نیست. برای این کار معمولا از کتابخانه‌هایی که گروه‌های خاصی نوشته‌اند استفاده می‌شود. و بعید می‌دانم که فعلا چیزی برای زبان فارسی ایجاد شده باشد.

----------


## zoofa

> دوستان عزیز از همتون ممنونم ولی مشکل من هنوز حل نشده !!!


دوست شما باید تمام ی و ک هایی که در بانک به زبان عربی ثبت شده است را به ی و ک فارسی جایگزین کنید و با اون کدی که گفتم در رویداد keypress بنویسید مشکلتان حل می شود

----------


## pardeew

در مطلب لینک زیر، توضیحاتی درباره یکسان سازی حروف ی و ک (فارسی و عربی) و نحوه جستجوی صحیح کلمه یا عبارت، به طوری که همه حروف ی و ک را دربرگیرد ... وجود دارد.
امیدوارم مفید واقع شود.

http://www.eslamifar.com/index.php/archives/88

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

خودم خیلی دنبال این موضوع گشتم تا به اینجا رسیدم ... به نظرم که این تنها راه حل برای جستجو در بانک اطلاعاتی است.
خوشحال میشم نظر شما رو هم بدونم تا به عنوان یک تازه کار از تجربیات دیگران هم استفاده کنم.

----------


## mn_zandy63

سلام دوست من،
در تکمیل پاسخ دوستان اینجا رو هم ببین.
http://vahidnasiri.blogspot.com/2009...g-post_13.html
کاملترین روش برای این مشکل هست که تا حالا دیدم.
موفق باشی

----------


## pardeew

> سلام دوست من،
> در تکمیل پاسخ دوستان اینجا رو هم ببین.
> http://vahidnasiri.blogspot.com/2009...g-post_13.html
> کاملترین روش برای این مشکل هست که تا حالا دیدم.
> موفق باشی


دوست عزیز ... مطلب شما رو قبلا خونده بودم ... مطمئنا این هم یک روش برای یکسان سازی حروف در دیتابیس می باشد که هنگام جستجو نیز حروف همانند سازی می شوند و مشکلی برای جستجو به وجود نمی آید ... ولی کدی که من در سایتم گذاشتم فرقی نمی کنه که با چه حروف ی و ک در دیتابیس یا در عبارت جستجو، مواجه شود .... به هر حال اگر بشه کدی که شما در سایتتون گذاشتید به صورت اتوماتیک هنگام Insert و یا update عمل کنه خیلی بهتره ...

موفق باشید.

----------


## mn_zandy63

> دوست عزیز ... مطلب شما رو قبلا خونده بودم ... مطمئنا این هم یک روش برای یکسان سازی حروف در دیتابیس می باشد که هنگام جستجو نیز حروف همانند سازی می شوند و مشکلی برای جستجو به وجود نمی آید ... ولی کدی که من در سایتم گذاشتم فرقی نمی کنه که با چه حروف ی و ک در دیتابیس یا در عبارت جستجو، مواجه شود .... به هر حال اگر بشه کدی که شما در سایتتون گذاشتید به صورت اتوماتیک هنگام Insert و یا update عمل کنه خیلی بهتره ...
> 
> موفق باشید.


سلام دوست من
البته این آدرس، آدرس سایت بنده نیست.

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

البته  شما ممکنه نظرت متفاوت باشه، اما به نظر من روش اول بهتره و اصلی ترین دلیلم هم اینه که رعایت مورد اول برام ساده تره. ;)
یعنی موقع درج، ی و ک رو یکسان کنی که چند خط اول این صفحه که لینکش رو گذاشتم به همین مورد پرداخته.
در این صورت دیگه نیازی نیست موقع جستجو نگران تفاوت حروف باشیم.

بعد از اون این بحث پیش میاد که حالا اومدیم و تا الآن که این مورد رو دقت نکرده بودیم یه سری ی و ک متفاوت داخل دیتابیس داریم. در این صورت با کدی که در ادامه متن توضیح داده شده میتونی کل ی و ک های موجود رو اصلاح کنی.


البته به نظر من روش شما برای کسی که رویکرد دوم رو انتخاب میکنه، روش زیبایی هست.

موفق باشی

----------


## im ezraeel

- در هنگام مقایسه در دستورات از N استفاده شود. مانند    


  select    *   from  student  where  name = N'علي'

----------


## SAEEDDOE

با سلام و تشکر از جوابتان 
من هم این مشکل رو دارم فکر کنم کدی که در بالا نوشتید بصورت ذیل صحیح می باشد یعنی ما حرف ی و ک را از همان ابتدا تبدیل به عربی بکنیم و در موقع جستجو نیز بدنبال يو  ك عربی باشیم.من این حالت رو انتخاب کردم و جواب گرفتم. با تشکر 
سعید.
if (e.KeyChar == 'ی') e.KeyChar = 'ي';
if (e.KeyChar == 'ک') e.KeyChar = 'ك';

----------


## farkhondei70

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

----------


## naghshineh m&h

سلام مشکل به راحتی و صد درصد قابل حل است فقط نکته ای که اینجانب  به آن ایمان دارم این است که مهندسین مایکروسافت هیچ راه غیر قابل حلی  برایشان نیست و هیچگاه برنامه نویسی را به حدی سخت نمی کنند که کاربر  بخواهد ابتدا Replace کند بعد یه کاردیگه و بعد .......... 
راه حل به این شکل است که دقیقا قبل از like از حرف N استفاده کنید 
مثالSELECT * FROM tbl WHERE col LIKE N'%ی%'

----------


## mojtabamalaekeh

سلام
مشکل من با حرف ی و ي حل شده.
میگم شاید به درد کسی خورد  :چشمک: 

این راه حل ربطی به حروف ک و ك نداره و جواب نمیده.

فیلدی که میخواید عملگر LIKE رو روش اعمال کنید به NCHAR تبدیل کنید:
مقدار سمت راست عملگر LIKE رو تبدیل کنید یا نه فرقی نمیکنه. اولش N بذارید یا نذارید هم فرقی نمیکنه.

use [Statistics]
go
SELECT 
tblPersonnels.ID, tblPersonnels.fldYeganID, tblYegans.fldName AS fldYeganName, tblPersonnels.fldPersNo, 
tblPersonnels.fldGrade, tblPersonnels.fldName, tblPersonnels.fldFamily, 
tblPersonnels.fldDescription 
FROM tblPersonnels LEFT OUTER JOIN tblYegans ON tblPersonnels.fldYeganID = tblYegans.ID 

WHERE
CAST(tblPersonnels.fldGrade + ' ' + tblPersonnels.fldName + ' ' + tblPersonnels.fldFamily AS VARCHAR) 
LIKE '%ی%'


خروجیش شامل مقادیر دارای «ی» و «ي» همزمان خواهد بود :)
ضمنا من همیشه توی طراحی جدول هام برای فیلدهای رشته ای، نوع nvarchar(max) استفاده می کنم و برای nchar و text هیچ آزمایشی انجام ندادم.

----------


## jigar2000

سلام ممنونم مشکل من حل شد فقط نکته ای که در این کد باید رعایت شود این است که بین حرف N و علامت ' فاصله نباشد.

----------


## jigar2000

> سلام دوست عزیز
> 
> توی كدی كه نوشتی، اگه بدین صورت عمل كنی، ایشالا مشكلت حل میشه:
> where sabt.family like N'%" + textBoxX86.Text + "%'
> 
> با تشكر از آقای مداح
> 
> موفق باشید.


سلام ممنونم مشکل من حل شد فقط نکته ای که در این کد باید رعایت شود این است که بین حرف N و علامت ' فاصله نباشد.

----------

