PDA

View Full Version : سوال: مشکل با حرف " ی " در جستجو ( پایگاه=اکسس - زبان = سی شارپ - ظرف=DataGrid )



shahram_c1
دوشنبه 05 دی 1390, 19:01 عصر
با سلام خدمت اساتید محترم...

برنامه ای به زبان C#‎‎‎ تحت پایگاه داده Accsess نوشته ام که مشکل زیر را دارد :

یک text box با نام txt_name قرار دادم که از طریق اون، کاربر میتونه کلیدواژه ای از لیست اسامی رو جستجو کنه به طوری که با وارد کردن لحظه ای هر کاراکتر، فیلدهای مشابه اون رو از پایگاه داده استخراج و در یک Data Grid قرار میده...
مشکلی که هست اینه که با وارد کردن اسمی دارای " ی " مثلا ابراهیم ، تا حرف هـ مشکی در استخراج نداره ولی با رسیدن به خود حرف ی گویی که کاراکتری خارج از اسامی موجود در لیست پایگاه داده زده شده و در نتیجه استخراج متوقف شده و Data Grid ما محتویاتش خالی نمایش داده می شود!!!

کد استفاده شده :
SELECT Name , userName , Password from Customers where Name like
' %" + () txt_name.Text.ToString + " '

پیشاپیش از پاسخ و راهنمایی دوستان عزیز ممنونم..

سوداگر
سه شنبه 06 دی 1390, 02:00 صبح
یافتم، بالاخره توی 32 صفحه بعد پیداش کردم:قلب:
http://barnamenevis.org/showthread.php?316489-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AD%D8%B1%D9%88%D9%81-%D8%B9%D8%B1%D8%A8%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D9%87-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C

shahram_c1
سه شنبه 06 دی 1390, 18:57 عصر
متاسفانه راهکارهای دوستان در صفحه پیشنهادی شما مشکلی رو حل نکرد....

یعنی هیچ برنامه نویس حرفه ای نداریم تو barnamenevis.org که پاسخ قطعی بده تا مشکل من و امثال من که چنین مشکلی دارند و کم هم نیستند، حل بشه؟!؟؟

سوداگر
سه شنبه 06 دی 1390, 19:30 عصر
شما به جای اینکه ی را بزنید با شیفت+X این کار رو انجام بده --> ي و بالعکس. اگه نتیجه جستجو دلخواه بود که اون تاپیک به دردتون میخوره وگرنه ایراد از ورود داده های غلط به دیتا بیس نیست و باید بیشتر توضیح بدید.
ی های موجود در دیتابیس شما ی عربی است یا اینکه ی فارسی است ولی این کیبردی که با اون کار می کنید ي عربی وارد می کند.
لطفا به این سوال جواب بدین: ی هایی که در تکت باکس نمایش داده می شود نقطه دارد؟

shahram_c1
سه شنبه 06 دی 1390, 19:48 عصر
ضمن تشکر،

در ورود اطلاعات به text Box ، ی به صورت فارسی ( بدون دو نقطه زیرین یعنی ي ) هستش...

ضمن اینکه باید بگم با تایپ ی عربی به هنگام ورود اطلاعات در تکست ( ي ) ، مشکل کاملا حل می شه.

راهکارهایی که دوستان ارائه داده بودن از جمله تبدیل ی فارسی به عربی هنگام جستجو ( در رویداد KeyPress مربوط به text Box ) اثر بخش نبود...

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

سوداگر
سه شنبه 06 دی 1390, 20:21 عصر
ضمن اینکه باید بگم با تایپ ی عربی به هنگام ورود اطلاعات در تکست ( ي ) ، مشکل کاملا حل می شه.
تبدیل ی فارسی به عربی هنگام جستجو اثر بخش نبود، آره، توی همون تاپیک هم گفته شد.
ولی آخر اون تاپیک که گفته شد برای حفظ یکپارچگی پایگاه داده بهتره کلّ ي ها رو به ی تبدیل کرده و در دیتابیس ذخیره کنیم!
همین کدی که مدیر بخش VB.Net دادن:
update [TblCustomer] set [FldName] = Replace([FldName],'ی','ي')
البته کل داده ها رو باید آپدیت کنید و ي ها رو با ی عوض کنید تا نیازی به تبدیل ي به ی موقع جستجو باشیم!
موفق باشید.

bozhmehrani
سه شنبه 06 دی 1390, 20:37 عصر
سلام من همین مشکلو داشتم البته نه فقط "ی " کلمه های دیگه هم بود یادم نیس
بعد یه فایل دی ال ال پیدا کردم که باید اونو کپی میکردی تو سیستم تا درست شه ، دقیق نمیدونم مسیرش کجا بود فک کنم system 32بود. بعد دیگه این مشکل پیش نمیومد
واست میل کنم؟

sobaisobai
سه شنبه 06 دی 1390, 20:50 عصر
سلام من همین مشکلو داشتم البته نه فقط "ی " کلمه های دیگه هم بود یادم نیس
بعد یه فایل دی ال ال پیدا کردم که باید اونو کپی میکردی تو سیستم تا درست شه ، دقیق نمیدونم مسیرش کجا بود فک کنم system 32بود. بعد دیگه این مشکل پیش نمیومد
واست میل کنم؟
خب بذار تو تاپیک تا همه استفاده کنن دوست عزیز

bozhmehrani
سه شنبه 06 دی 1390, 21:14 عصر
http://s2.picofile.com/file/7226547953/kbdfa.dll.html
آدرسشو یادم دقیق یادم نیس
مطمئن شدم میزارم

سوداگر
پنج شنبه 08 دی 1390, 02:38 صبح
http://barnamenevis.org/showthread.php?320589-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B5%D9%84%D8%A7%D8%AD-%DA%A9%D9%84%D9%85%D8%A7%D8%AA-%D8%B9%D8%B1%D8%A8%DB%8C-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3

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

hossein_sh2008
سه شنبه 17 اردیبهشت 1392, 10:58 صبح
سلام دوستان
من اين مشكل رو داشتم و وقتي بررسي كردم متوجه شدم كه يك نرم افزار تصحيح كيبورد نصب كردم كه مشكل از اونه كه با حذف اون مشكلم حل شد
شما هم يه جستجويي بكنيد شايد مشكلتون اين بود

hamid_hr
سه شنبه 17 اردیبهشت 1392, 12:32 عصر
سلام
من برا رفع اين مشكل اين كارو كردم
اول يك پروسيجر پيدا كردم كه كل ديتابيسو به صورت يك پارچه در اورد يعني همه "ي" و "ی" و "ك" و "و" و "پ" و ... رو يارچه كرد
اين كد پروسيجر كه پيداش كردم

Create procedure [dbo].[ChangeCodePage]
as

select ROW_NUMBER() over (order by TBLs.TABLE_NAME, COLs.COLUMN_NAME) Row, TBLs.TABLE_NAME TblName, COLs.COLUMN_NAME ColName
into #t
from INFORMATION_SCHEMA.TABLES TBLs
join INFORMATION_SCHEMA.COLUMNS COLs on TBLs.TABLE_NAME = COLs.TABLE_NAME
where TABLE_TYPE = 'BASE TABLE'
and DATA_TYPE in ('char', 'nchar', 'varchar', 'nvarchar')

declare @x varchar(1000)

create table #errors(Error varchar(1000))

declare @i int
set @i = 0

while 1 = 1
begin
set @i = (select top 1 Row from #t where Row > @i)
if @i is null
break

select @x = 'update [' + TblName + '] set [' + ColName + '] = Replace( Replace( Replace([' + ColName + '], nchar(1603), nchar(1705)), nchar(1610), nchar(1740)), nchar(1609), nchar(1740))'
from #t
where Row = @i

begin try
exec(@x)
end try

begin catch
insert into #errors
values(char(13) + char(10) + 'ERROR: ' + char(13) + char(10) + @x + char(13) + char(10))
end catch
end

select *
from #errors

print 'CODE PAGE GHANGING DONE!'

drop table #t
drop table #errors

طرز استفاده از اين كد هم راحته
اول تو sql اجراش كنين تا پروسيجر ساخته بشه بعد پروسيجر رو اجرا كنين

exec ChangeCodePage

بعد تو برنامه خودم هر دستوري رو ميخوام به sql پاس بدم رو با يك تابع حروف "ي" و "ك" و "و" و ... رو به صورت يكپارچه مثل ديتابيس در مياره بعد ميفرسته تو ديتابيس

اينم تابع تو C#‎ من
public string ChengCode(string str)
{
return str.Replace((char)1603, (char)1705).Replace((char)1610, (char)1740).Replace((char)1609, (char)1740);
}

مثلا اگه بخواين دستورات داخل متقيير sqlcmd رو اجرا كنين قبل از اجرا بايد اين كارو بكنين
sqlcmd = ChengCode(sqlcmd);

ديگه هيچ مشكلي با انواع مختلف صفحه كليد ندارم و نرم افزار اضافي هم نميخواد نصب كنم:لبخند:

hosaini
سه شنبه 17 اردیبهشت 1392, 22:49 عصر
update

(((A01setA02=LTRIM(RTRIM(Replace(REPLACE(A02,char( 223),char(152)),nchar(1610),nchar(1740

vahid8631
پنج شنبه 27 تیر 1392, 19:04 عصر
با سلام
نوشتن شرط به صورت زیر این مشکل رو حل می کنه
select * from tbl where
'علی'name=N

davidrobert
پنج شنبه 27 تیر 1392, 21:44 عصر
بفرمایید این کد ها برای جستجو هستش برای عد و رشته فرق میکنه case "شماره سند": { query = "select * from Tbl_AddFoctorKhedmat where convert(varchar,A_Doc) LIKE N'%" + TxtSearch.Text + "%'"; break; }
case "شماره فاکتور": { query = "select * from Tbl_AddFoctorKhedmat where convert(varchar,A_Foc) LIKe N'%" + TxtSearch.Text + "%'"; break; }
case "کد خدمات": { query = "select * from Tbl_AddFoctorKhedmat where convert (varchar,A_CodeKhedemat) LIKE N'%" + TxtSearch.Text + "%'"; break; }
case "نام سرويس": { query = "select * from Tbl_AddFoctorKhedmat where A_NameServic LIKE N'%" + TxtSearch.Text + "%'"; break; }
case "شرح و حال سرويس": { query = "select * from Tbl_AddFoctorKhedmat where A_Distrebuite LIKE N'%" + TxtSearch.Text + "%'"; break; }
فقد این رو در نظر بگرید که بعد از حرف لاک Like N'"+txtname.text+"' حرف N فراموش نشه وقتی حرف N رو قرار بدید مشکل شما حل میشود و مقدار ک و ی را پیدا میکند برای شما و با مشکل بر خورد نمیکنید.

mohsen@
سه شنبه 02 مهر 1392, 20:06 عصر
damet garm ba harf e zer do nogheht

nafisehk
دوشنبه 15 مهر 1392, 11:15 صبح
سلام

وقی اطلاعات تو bindingsource هستش استفاده از N اررور داره
bindingsource1.filter="name like N'%"+txtName.text+"%'


error
Syntax error: Missing operand after ''%ح%'' operator

Hossis
چهارشنبه 20 آذر 1392, 21:00 عصر
سلام
من برا رفع اين مشكل اين كارو كردم
اول يك پروسيجر پيدا كردم كه كل ديتابيسو به صورت يك پارچه در اورد يعني همه "ي" و "ی" و "ك" و "و" و "پ" و ... رو يارچه كرد
اين كد پروسيجر كه پيداش كردم

Create procedure [dbo].[ChangeCodePage]
as

select ROW_NUMBER() over (order by TBLs.TABLE_NAME, COLs.COLUMN_NAME) Row, TBLs.TABLE_NAME TblName, COLs.COLUMN_NAME ColName
into #t
from INFORMATION_SCHEMA.TABLES TBLs
join INFORMATION_SCHEMA.COLUMNS COLs on TBLs.TABLE_NAME = COLs.TABLE_NAME
where TABLE_TYPE = 'BASE TABLE'
and DATA_TYPE in ('char', 'nchar', 'varchar', 'nvarchar')

declare @x varchar(1000)

create table #errors(Error varchar(1000))

declare @i int
set @i = 0

while 1 = 1
begin
set @i = (select top 1 Row from #t where Row > @i)
if @i is null
break

select @x = 'update [' + TblName + '] set [' + ColName + '] = Replace( Replace( Replace([' + ColName + '], nchar(1603), nchar(1705)), nchar(1610), nchar(1740)), nchar(1609), nchar(1740))'
from #t
where Row = @i

begin try
exec(@x)
end try

begin catch
insert into #errors
values(char(13) + char(10) + 'ERROR: ' + char(13) + char(10) + @x + char(13) + char(10))
end catch
end

select *
from #errors

print 'CODE PAGE GHANGING DONE!'

drop table #t
drop table #errors

طرز استفاده از اين كد هم راحته
اول تو sql اجراش كنين تا پروسيجر ساخته بشه بعد پروسيجر رو اجرا كنين

exec ChangeCodePage
:
فرض کنید من می خوام تو وی بی یا سی شارپ این کد رو استفاده کنمپ
میشه شسته رفته (هلو تو گلو) یک نمونه بنویسید که چیکار کنیم؟؟

mriman
یک شنبه 15 دی 1392, 07:26 صبح
متاسفم برای انجمن برنامه نویس و برنامه نویسان حرفه ای این انجمن که نتونستن یک راه یکپارچه، مختصر، مفید و کارا برای چنین مشکل دائمی ای پیدا کنند!!!!!

davidrobert
یک شنبه 15 دی 1392, 11:09 صبح
متاسفم برای انجمن برنامه نویس و برنامه نویسان حرفه ای این انجمن که نتونستن یک راه یکپارچه، مختصر، مفید و کارا برای چنین مشکل دائمی ای پیدا کنند!!!!!
سلام دوست عزیز من برنامه نویس حرفه ای نیستم ولی بچه های برنامه نویس این انجمن باید چیکار کنن برای جستجو فقط همین روش وجود داره.case "شماره سند": { query = "select * from Tbl_AddFoctorKhedmat where convert(varchar,A_Doc) LIKE N'%" + TxtSearch.Text + "%'"; break; }
case "شماره فاکتور": { query = "select * from Tbl_AddFoctorKhedmat where convert(varchar,A_Foc) LIKe N'%" + TxtSearch.Text + "%'"; break; }
case "کد خدمات": { query = "select * from Tbl_AddFoctorKhedmat where convert (varchar,A_CodeKhedemat) LIKE N'%" + TxtSearch.Text + "%'"; break; }
case "نام سرويس": { query = "select * from Tbl_AddFoctorKhedmat where A_NameServic LIKE N'%" + TxtSearch.Text + "%'"; break; }
case "شرح و حال سرويس": { query = "select * from Tbl_AddFoctorKhedmat where A_Distrebuite LIKE N'%" + TxtSearch.Text + "%'"; break; }

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

hashtgerd2
یک شنبه 15 دی 1392, 14:55 عصر
بهترین کار bind کردن دستی کمبو باکس به جدول هستش من از این روش استفاده میکنم خیلی بهتره سرعتش هم خوبه من تو کد زیر یه کوئری زدم که مقدار یه فیلد توی یه کمبو باکس میادش بعد بر اساس اون سه تا لیبل یا تکس باکس رو به مقدار کمبوباکس بایند میکنم یا هر چند تا که خواستید

DataTable table = new DataTable();
using (SqlConnection sqlConn = new SqlConnection(MDIParent1.connectionstringsql)) //use your conn. string here
{
using (SqlDataAdapter da = new SqlDataAdapter(@"SELECT jeen_ID,name,price,priceforoosh,size FROM jeens", sqlConn))
da.Fill(table);
}
cmbkharidname.DataSource = new BindingSource(table, null);
cmbkharidname.DisplayMember = "Name";
cmbkharidname.ValueMember = "jeen_ID";
try { lblJeen_ID.Text = cmbkharidname.SelectedValue.ToString(); }
catch { }
cmbkharidname.ValueMember = "priceforoosh";
try { txtprice.Text = cmbkharidname.SelectedValue.ToString(); }
catch { }
cmbkharidname.ValueMember = "size";
try { lblSizeinAddForoosh.Text = cmbkharidname.SelectedValue.ToString(); }
catch { }

mriman
دوشنبه 16 دی 1392, 06:43 صبح
چیکار کنن!!!!
خوب روش خوب پیدا کنن دیگه!!!!
به نظر من همیکه در هر ورودی ، کاراکتر ی ورودی را Replace کنیم بهترین کار باشه
یعنی تا بحال من روش بهتری پیدا نکردم



بایند کردن کومبو باکس خوبه اما خیلی جاها کارایی نداره...!

hashtgerd2
دوشنبه 16 دی 1392, 08:29 صبح
خب بعد از اینکه کمبو باکس رو بایند کردی این دو خاصیت رو هم تنظیم کن
autocompletemode رو بزار suggest
autocompletesource رو هم بزارCustomSource

بعد ش اگه تو کمبو باکس چیزی تایپ کنی خودش فیلتر میکنه
مثلا اگه داخل کمبو باکس سه تا کلمه
ایران ایرانی ایرانه داشته باشی تو هر لحظه با تایپ کردن خودش فیلتر میکنه مثلا با تایپ ا سریع این سه کلمه رو نشونت میده

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

سلام .این بهترین روش هستش:لبخند:

mmn.3003
یک شنبه 21 آبان 1396, 12:10 عصر
ی را حل خیلی ساده وجود داره شما کافیه ی موقع سرچ جای ي عربی رو با ی فارسی عوض کنید
برای مثال در سرچ با متد linq
var sh = from c in std_table
where c.Std_Name.Trim().Replace('ي', 'ی').Contains(tb_name.Text.Trim())
select c;
در ضمن فک کنم اینجا جابه جا مینویسه پس حواستون باشه که توی تابع replace اول باید ي عربی بیاد بعد فارسی
ی نکته دیگه اینکه ي عربیرو میتونین با shift+ x بنویسین