PDA

View Full Version : مشکل در select where با فارسی در sql express و C#



farhadsoft
چهارشنبه 14 فروردین 1392, 09:52 صبح
با سلام
من دارد از sql express و C# استفاده میکنم
اطلاعات به صورت فارسی در sql express ذخیره میشه و قابل مشاهده هست
ولی وقتی می خوام select بزنم مثلا

select * from Mytable where myfield like farsichar

چیزی بر نمی گردونه
منظورم از farsichar یک کلمه یا حرف فارسی می باشد

فکر مینم از unicode دیتابیسم باشه لطفا راهنمایی کنید
با تشکر

khokhan
چهارشنبه 14 فروردین 1392, 10:21 صبح
سلام

بهتره یه Nهم کنار مورد جستجو بگذاری


select * from TableName where FieldName Like N'%"+textbox1.text + '%'

esafb52
چهارشنبه 14 فروردین 1392, 10:23 صبح
cmd.CommandText = "Select * from tbbook Where motarjem like '%" + textBoxX6.Text + "%' order by ID";
اگه رشته هم هست تو کوتیشن بذار

farhadsoft
چهارشنبه 14 فروردین 1392, 10:32 صبح
متاسفانه هیچ کدوم جواب نداد
این مشکل فقط برای فارسی می باشد

veniz2008
چهارشنبه 14 فروردین 1392, 10:40 صبح
سلام.
با همه کلمات مشکل داری یا فقط با کلماتی که شامل حرف ک و ی هست؟.
کوئری که نوشتید بذارید تا یه نگاه کنیم.

farhadsoft
چهارشنبه 14 فروردین 1392, 10:52 صبح
سلام.
با همه کلمات مشکل داری یا فقط با کلماتی که شامل حرف ک و ی هست؟.
کوئری که نوشتید بذارید تا یه نگاه کنیم.


public DataTable RetrieveFilterPerson(string PersonSearched)
{
DataTable DT = new DataTable();
SqlConnection Conn = PublicClass.OpenConnection();
Conn.Open();
SqlDataAdapter MyCommand = new SqlDataAdapter("SELECT * FROM Persons WHERE PersonName Like '%" + PersonSearched + "%' or PersonCode Like '%" + PersonSearched + "%' order by PersonID DESC", Conn);
MyCommand.Fill(DT);
Conn.Close();
return DT;
}


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

farhadsoft
چهارشنبه 14 فروردین 1392, 10:54 صبح
publicDataTable RetrieveFilterPerson(string PersonSearched)
{
DataTable DT = newDataTable();
SqlConnection Conn = PublicClass.OpenConnection();
Conn.Open();
SqlDataAdapter MyCommand = newSqlDataAdapter("SELECT * FROM Persons WHERE PersonName Like '%" + PersonSearched + "%' or PersonCode Like '%" + PersonSearched + "%' order by PersonID DESC", Conn);
MyCommand.Fill(DT);
Conn.Close();
return DT;
}

veniz2008
چهارشنبه 14 فروردین 1392, 11:17 صبح
فیلد فارسی رو از چه نوعی گرفتید؟
این کد رو هم امتحان کنید :

SqlDataAdapter MyCommand = newSqlDataAdapter("SELECT * FROM Persons WHERE PersonName Like N'%" + PersonSearched.Trim() + "%' or PersonCode Like N'%" + PersonSearched.Trim() + "%' order by PersonID DESC", Conn);

farhadsoft
چهارشنبه 14 فروردین 1392, 12:21 عصر
فیلد فارسی رو از چه نوعی گرفتید؟
این کد رو هم امتحان کنید :

SqlDataAdapter MyCommand = newSqlDataAdapter("SELECT * FROM Persons WHERE PersonName Like N'%" + PersonSearched.Trim() + "%' or PersonCode Like N'%" + PersonSearched.Trim() + "%' order by PersonID DESC", Conn);


یا گذاشتن N درست شد
ولی چرا باید N را بزارم؟؟
چطور میتونم بدون N این کارو انجام بدم

نوع فیلد فارسی nvarchar

veniz2008
چهارشنبه 14 فروردین 1392, 12:37 عصر
معمولا زمانیکه از پارامترها استفاده کنید دیگه نیازی به استفاده از N نیست. حرف N به sql میفهمونه که میخوایم با داده های یونیکد(که حروف فارسی هم جزیی از این داده ها هستند کار کنیم).
ولی بهترین راه حل در ADO، همیشه stored procedure بوده. هم از لحاظ سرعت، هم از لحاظ امنیت و هم برای پروژه های متوسط رو به بالا کارایی واقعی خودشو نشون میده و درگیر اینجور مسائل نمی شید.
اینم بگم که روش کدنویسی تون منسوخ شده و 100 درصد خطرناکه و براحتی قابل هک شدن هست(بهش میگن sql injection ) که برای حل این مشکل بایستی از پارامترها استفاده کنید که قبلا بارها در سایت دربارش بحث شده.
موفق باشید.

farhadsoft
چهارشنبه 14 فروردین 1392, 12:53 عصر
public DataTable RetrieveFilterPerson(string PersonSearched)
{
DataTable DT = new DataTable();
SqlConnection Conn = PublicClass.OpenConnection();
Conn.Open();
SqlDataAdapter MyCommand = new SqlDataAdapter("SELECT * FROM Persons WHERE PersonName Like @PersonSearched or PersonCode Like @PersonSearched order by PersonID DESC", Conn);
MyCommand.SelectCommand.Parameters.AddWithValue("@PersonSearched", "%"+PersonSearched+"%");
MyCommand.Fill(DT);
Conn.Close();
return DT;
}




اینجوری خوبه مهندس؟؟

veniz2008
چهارشنبه 14 فروردین 1392, 13:11 عصر
بله منظورم به همین شکل بود ولی اگر از stored procedure ها استفاده کنی قطعا خیلی بهتر خواهد بود.
موفق باشید.

reza1699
جمعه 13 دی 1392, 21:16 عصر
من خیلی وقت پیش این مشکل رو داشتم ! صرفا با گذاشتن یک حرف N درست میشه