PDA

View Full Version : سوال: مشکل در گزارش گیری از فیلدهایی که حاوی حرف (ی) هستن



neda_dela
پنج شنبه 17 دی 1388, 23:22 عصر
سلام دوستان
من در گزارش گیری بر اساس فیلدهایی که مقدار اونها حاوی حرف (ی) هستن مشکل پیدا کردم. مثلا میخام لیست دانش اموزانی رو داشته باشم که شغل پدرشون فرهنگی هست، این مقدار خاص یعنی فرهنگی توش حرف ی داره و نشون نمیده در صورتی که من این مقدار رو توی بانکم دارم. اما مثلا دانش آموزانی رو که شغل پدرشون آزاد هست رو کامل نشون میده. در ضمن هیچ فرقی نمیکنه که این حرف ی آخر کلمه باشه یا وسط اون. چون با مقدار مثلا "دبیر" هم امتحان کردم.
البته من هرچی به مقدار ذخیره شده در بانک و مقداری که توی گرید نشون داده میشه دقت کردم تفاوت ظاهری ندیدم چون قبلا که به این مشکل بر خورده بودم توی بانک (ی) ذخیره میشد ولی توی گرید این ی رو با دو نقطه زیرش نشون میداد. اما الان این تفاوت دیده نمیشه نمی دونم مشکل دقیقا چیه این هم کد کریستال ریپورتم هست:


public partial class report_viewer : Form
{
string fjob;
string term;
string year;
public report_viewer(string param, string trm, string yr)
{
term = trm;
year = yr;
fjob = param;
InitializeComponent();
}
private void report_viewer_Load(object sender, EventArgs e)
{
try
{
SqlConnection Conn = new SqlConnection("Data Source=.;Initial Catalog=quran;Integrated Security=True");
string StrSelect = "SELECT [st-shakhsi].firstname, [st-shakhsi].lastname, [st-shakhsi].fname, [st-shakhsi].pic, [st-shakhsi].tel, [st-shakhsi].mobile, [st-shakhsi].fjob, [st-sabt].sath, [st-sabt].years, [st-sabt].term, [st-sabt].educator FROM [st-shakhsi] INNER JOIN [st-sabt] ON [st-shakhsi].id = [st-sabt].id WHERE ([st-shakhsi].fjob = '" + fjob + "') AND ([st-sabt].term = '" + term + "') AND ([st-sabt].years = '" + year + "')";
SqlDataAdapter DA = new SqlDataAdapter(StrSelect, Conn);
quranDataSet DS = new quranDataSet();
DS.Clear();
Conn.Close();
Conn.Open();
DA.Fill(DS, "Report1");
Conn.Close();
CrystalReport2 CR = new CrystalReport2();
CR.SetDataSource(DS.Tables["Report1"]);
crystalReportViewer1.ReportSource = CR;

}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}

}

mir555
جمعه 18 دی 1388, 00:19 صبح
اگه کالیشن دیتابیست arabic_ci_ai_ks به مشکل حرف ی نمی خوری

neda_dela
جمعه 18 دی 1388, 10:17 صبح
اگه کالیشن دیتابیست arabic_ci_ai_ks به مشکل حرف ی نمی خوری
ممنون دوستم
اما میشه دقیقا توی اس کیو ال 2000 آدرس بدی که بدونم این کالیشن رو از کجا میشه تغییر داد؟
بازم ممنون

mir555
جمعه 18 دی 1388, 10:42 صبح
اینم توضیحات کامل
CharacterSet در SQL Server با Collation ها کنترل می شود. Collate یک خصوصیتی است که برای سطوح زیر قابل تنظیم است:

1-Server
2-DataBase خاص
3-فیلد خاص از جدول خاص
4-یک Query خاص
زمان نصب SQL Server ،از شما Collation پرسیده می شود.این می شود collection مربوط به سرور. که آن پیش فرض تمام DataBase ها و به تبع فیلدهای جداول انان و تمام Query ها می شود.

برای دیدن لیست این Collatio ها از دستور زیر استفاده کنید:
کد:
SELECT *
FROM ::fn_helpcollations()
برای اینکه بدانید Collation مربوط به سروزتان چیست:
کد:
SELECT SERVERPROPERTY('collation')
برای اینکه بدانید Collation مربوط به DataBase مورد نظرتان چیست:
کد:
SELECT DATABASEPROPERTYX(dbname,'collation')

برای تغییر Collation یک DataBase:
کد:
ALTER DATABASE dbname
COLLATE collationname
و یا اگر می خواهید یک Query خاص Collation خاص خود را داشته باشد:
کد:
SELECT fieldlist
FROM tablename
COLLATE collationname
مثلا:
کد:
SELECT *
FROM Product
ORDER BY ProductName
COLLATE Danish_norwegian_CI_AI

البته لازم به ذکر است که Collation فقط رو فیلدهایی عمل می کند که نوعشان Char , VARCHAR یا TEXT باشد. این خصوصیت مشخص می کند که :

1- از چه Codepageی استفاده شود.که SQL Server می تواند 2 نوع CharacterSet را پشتیبانی کند:
الف-Unicode
ب-non-Unicode مثلا:
1252<-Arabic->1256 , Latin

2-Sort Order به چه شکل باشد. Sort Order به SQL Server می گوید که چگونه و بر طبق چه قاعده ای , اطلاعات رشته ای را مقایسه , تلفیق , مرتب و ارائه کند.
مثلا case-sensitive یا case-insensitive باشد , accent-sensitive یا accent-insensitive باشد , مرتب ساری بر اساس Dictionary باشد یا Binary.

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

اگه سوال دیگه داری بفرمایید

neda_dela
جمعه 18 دی 1388, 20:33 عصر
اینم توضیحات کامل

بازم ممنون . اما این دستوراتی که شما داده بودید فقط دو تای اولش جواب داد. من این دستورات رو توی query analyzer اجرا کردم. در ضمن اون کولیشنی که شما پیشنهاد داده بودید هم توی لیست کولیشن ها بود
اما بقیه با خطا مواجه شد مثلا توی این:


SELECT DATABASEPROPERTYX(dbname,'collation')
من به جای dbname نام دیتا بیسم رو نوشتم اما از نام تابع خطا گرفت من احساس کردم شاید x آخر اضافی باشه پاکش کردم اما اینبار از نام دیتا بیسم خطا گرفت
و یا در مورد این یکی:


ALTER DATABASE dbname
COLLATE collationname

اینجا هم می گفت آلتر دیتا بیس faild شد
یادمه یه بار یه بنده خدا از طریق EnterPrise Manager این کار رو انجام می داد میشه؟
خودم یادم نیست

mir555
شنبه 19 دی 1388, 07:56 صبح
وقتی داخل دیتابیس اطلاعات داشته باشیم معمولا عوض کردن کلایشن درست انجام نمی شه اگه اطلاعات برات مهم نیست پاکش کن یا اگه مهمه یک دیتابیس جدید بساز با کلایشن درست بعدش اطلاعات از دیتابیس قدیمیت پمپ کن تو این دیتابیس

mosi_asgari
شنبه 19 دی 1388, 11:23 صبح
اگر هنگامی که می خواهی ' ی ' را در برنامت وارد کنی برای نوشتن ' ی ' ، شیفت را نگه داری بعد X را بزنی مشکلت حل مشه.

یعنی :

Shift+X : ي

neda_dela
شنبه 19 دی 1388, 12:15 عصر
وقتی داخل دیتابیس اطلاعات داشته باشیم معمولا عوض کردن کلایشن درست انجام نمی شه اگه اطلاعات برات مهم نیست پاکش کن یا اگه مهمه یک دیتابیس جدید بساز با کلایشن درست بعدش اطلاعات از دیتابیس قدیمیت پمپ کن تو این دیتابیس
مرسی اطلاعات دیتا بیس رو میشه پاک کنم ولی وای پاک کردن خود دیتا بیس نههههههههه:گریه:

neda_dela
یک شنبه 20 دی 1388, 00:05 صبح
وقتی داخل دیتابیس اطلاعات داشته باشیم معمولا عوض کردن کلایشن درست انجام نمی شه اگه اطلاعات برات مهم نیست پاکش کن یا اگه مهمه یک دیتابیس جدید بساز با کلایشن درست بعدش اطلاعات از دیتابیس قدیمیت پمپ کن تو این دیتابیس
من دیتابیسم رو پاک کردم و دوباره ساختمش و همون ابتدای ساخت collation اون رو به همون نامی که گفته بودین تغییر دادم اما بازم جوابی نگرفتم یعنی هنوز همون مشکل داره
البته من تعجب می کنم چون حرف ی توی دیتا گرید و بانک با هم فرقی ندارن و هیچ کدوم دو نقطه زیرش نداره
من روش این دوستمون رو هم امتحان کردم یعنی وقت ثبت اطلاعات ی رو با shift+x زدم و جواب داد
اما فکر می کنم این طوری برای کاربر سخت باشه

mir555
یک شنبه 20 دی 1388, 07:12 صبح
خوب شما می خوای مثلا کوئری بگیریی یحیی؟ درسته کاربر عادی وارد می کنی یحیی ولی شما می خوای ی اون عربی باشه


uid=uid.Replace('ی', 'ي');




فکر کن کاربر یک رشته وارد کرده شما رشته تو یک متغییر مثل uid قرار می دی اینجوری مشکل حرف ی درست میشه بعدش کوئری بگیر
در ضمن از الان به بعد اگه دیتا جدید وارد دیتابیس کنی دیگه مشکل ی نداره