PDA

View Full Version : مشکل با فیلد فارسی در پایگاه داده



amir-yeketaz
دوشنبه 01 شهریور 1389, 21:35 عصر
سلام ... من میخوام که یه فیلد که یه نام فارسی می گیره رو به حالت واحد بذارم و اگه کاربر یه نام تکراری انتخاب کرد واسش یه پیغامی ارسال بشه (این دیگه خیلی معروفه قضیش!!)
حالا من با حروف انگلیسی و اعداد مشکلی ندارم ولی هر موقع میخوام که با حروف فارسی این کارو بکنم نمیدونم چی میشه که تشخیص نمیده !!!!!!! پایگاه دادم که Sql هستش ....
حالا چیکار کنم که به نام های فارسی تکراری گیر بده :لبخند: ؟!!!!!

پیشاپیش ممنون

FastCode
دوشنبه 01 شهریور 1389, 21:55 عصر
یه نمونه کد بزار.
من میدونم مشکل چیه ولی باید کدتو که توش مقادیر رو تست میکنی بزاری تا بهت بگم چه تغییری میخواد.

mo.esmp
دوشنبه 01 شهریور 1389, 22:05 عصر
خوب شما از کدوم ورژن SQL Server استفاده میکنی ؟ همچین مشکلی هم قبلا برای من پیش اومده بود. من یه دیتابیس تو SQL Server 2000 ساخته بودم که Collation دیتابیس رو Arabic انتخاب کرده بودم. وقتی که کلمه فارسی رو مثل "وقتی" در دیتابیس ذخیره میکردم "ی" رو به صورت عربی یعنی دوتا نقطه به زیر "ي" میچسبوند وبعد ذخیره میکرد. حالا وقتی تو برنامه واسه کلمه "وقتی" جستجو میکردم که آیا "وقتی" تو دیتابیس وجود داره، برنامه "وقتی" رو پیدا نمیکرد چون من کیبورد من فارسی و "وقتی" رو بصورت فارسی تایپ میکردم در حالی که تو دیتابیس "وقتي" بصورت عربی ذخیره شده بود و اون دو نقطه زیر "ي" مشکل ساز میشد. حالا توصیه من اینه که از SQL Server 2008 استفاىه كنيد و Collation دیتابیس رو Persian انتخاب كنيد.

amir-yeketaz
دوشنبه 01 شهریور 1389, 22:50 عصر
من یه تیبل دارم برای ذخیره کالا که اونو میریزم تویه یه دیتاتیبل بعدش از تو دیتاتیبل (dt)چک میکنم که ایا تکراری هست یا نه ؟ اینم تابعی که ازش استفاده میکنم :

public bool IsNameNon_repetitive(string name)
{
string select = string.Format("Name = '{0}'", name);
DataRow[] temp = dt.Select(select);
if (temp.Length >= 1)
{
return false;
}
return true;
}
حالا چی ؟
نسخه ی Sql هم SqlExpress هست ؟ البته چون این پروژه یه پروژه ی خود تعریفی هست این مشکل رو میشه حلش کرد !!! ولی میخوام بدونم که چرا با فارسی اینجوری میشه ؟؟؟

FastCode
دوشنبه 01 شهریور 1389, 23:05 عصر
من یه تیبل دارم برای ذخیره کالا که اونو میریزم تویه یه دیتاتیبل بعدش از تو دیتاتیبل (dt)چک میکنم که ایا تکراری هست یا نه ؟ اینم تابعی که ازش استفاده میکنم :

public bool IsNameNon_repetitive(string name)
{
string select = string.Format("Name = '{0}'", name);
DataRow[] temp = dt.Select(select);
if (temp.Length >= 1)
{
return false;
}
return true;
}
حالا چی ؟
نسخه ی Sql هم SqlExpress هست ؟ البته چون این پروژه یه پروژه ی خود تعریفی هست این مشکل رو میشه حلش کرد !!! ولی میخوام بدونم که چرا با فارسی اینجوری میشه ؟؟؟
پس نتیجه میگیریم هیچ ربطی به collation نداره.
مشکل کد شما اینه که از N قبل از '' استفاده نکردی و SQL رشته شما رو تبدیل به ANSI/ASCII(من همیشه این دو تا رو قاطی میکنم) میکنه.اگر از پارامتر استفاده کنید مشکل شما اصلاً به وجود نمیاد چون SqlCommand به طور خودکار برای شما N رو در نظر میگیره.

amir-yeketaz
دوشنبه 01 شهریور 1389, 23:18 عصر
مشکل کد شما اینه که از N قبل از '' استفاده نکردی و SQL رشته شما رو تبدیل به ANSI/ASCII(من همیشه این دو تا رو قاطی میکنم) میکنه.
میشه اینو توضیح بدی ؟؟ این N قضیش چیشه ؟ البته یه جایی اینا رو شنیدم که مربوط به استاندارد کارکتر ها بود فکر کنم!!!!!

FastCode
دوشنبه 01 شهریور 1389, 23:21 عصر
میشه اینو توضیح بدی ؟؟ این N قضیش چیشه ؟ البته یه جایی اینا رو شنیدم که مربوط به استاندارد کارکتر ها بود فکر کنم!!!!!

درسته.
N یعنی
Unicode

amir-yeketaz
دوشنبه 01 شهریور 1389, 23:36 عصر
یعنی میگی اونجایی که دارم رکورد به دیتابیس insert میکنم از پارامتر استفاده کنم درست میشه ؟این N رو کجا بذارم؟؟؟؟ میشه اون کد قبل رو که دادم ویرایشش کنی؟

cheshm6k
سه شنبه 02 شهریور 1389, 00:07 صبح
من یه تیبل دارم برای ذخیره کالا که اونو میریزم تویه یه دیتاتیبل بعدش از تو دیتاتیبل (dt)چک میکنم که ایا تکراری هست یا نه ؟ اینم تابعی که ازش استفاده میکنم :

public bool IsNameNon_repetitive(string name)
{
string select = string.Format("Name = '{0}'", name);
DataRow[] temp = dt.Select(select);
if (temp.Length >= 1)
{
return false;
}
return true;
}
حالا چی ؟
نسخه ی Sql هم SqlExpress هست ؟ البته چون این پروژه یه پروژه ی خود تعریفی هست این مشکل رو میشه حلش کرد !!! ولی میخوام بدونم که چرا با فارسی اینجوری میشه ؟؟؟


public bool IsNameNon_repetitive(string name)
{
string select = string.Format("Name = N'{0}'", name);
DataRow[] temp = dt.Select(select);
if (temp.Length >= 1)
{
return false;
}
return true;
}
با سلام

در تکمیل فرمایش دوستان ، N رو قبل از تک کوتیشن اول میذاریم .هرعملی خواستی انجام بدی باید N رو بذاری

amir-yeketaz
سه شنبه 02 شهریور 1389, 00:15 صبح
ممنون ولی این کار exception پرتاب میکنه ؟؟!!!!!!!!
این:
Syntax Missing operand after"" ...
--------------------
من از این کدی که FastCode گفته بود به این روش انجام بده استفاده کردم ولی بازم تشخیص نمیده !!!!!:گریه:



SqlCommand cmd = new SqlCommand("Select *From Good Where Name = @Name", conn);
cmd.Parameters.AddWithValue("@Name", name);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dtRowExist = new DataTable();
da.Fill(dtRowExist);
if (dtRowExist.Rows.Count >= 1)
{
return false;
}
return true;

mo.esmp
سه شنبه 02 شهریور 1389, 02:36 صبح
پس نتیجه میگیریم هیچ ربطی به collation نداره.

برای مثال اسمی رو که داری جستجو میکنی از دیتابیست بگیر و در یک متغییر ذخیره کن. حالا این اسم رو که خودت تایپ میکنی با اسمی که از دیتابیس گرفتی کاراکتر به کراکتر مقایسه کن مبینی که در کجا تفاوت وجود داره.

amir-yeketaz
سه شنبه 02 شهریور 1389, 04:51 صبح
خیلی خیلی برام جالب شده ....
نام "سیب" رو دیباگ کردم آخرش space انداخته بود بعد trim کردم درست شد همون "سیب" اون زیره که مقدار متغیرها رو تو vs نشون میده عین هم بود ولی خیلی عادی == رو رد کرد :متعجب::متعجب::متعجب::متعجب:
بعد اومدم یه نام دیگه زدم به نام "پفک"(البته دو بار برای تست پیغام!) ولی این دیگه رد نکرد !!!!!!!!
این دیگه واقعا برام عجیب بود :متعجب::گیج:

پس نتیجه میگیریم هیچ ربطی به collation نداره.
فکر کنم داره !:لبخند: حالا این collation چی هست؟؟؟ میشه توضیح بدین ؟