PDA

View Full Version : سی شارپ و sql



آرام جان گل
پنج شنبه 07 تیر 1386, 21:19 عصر
سلام

من برنامه یک کتابخانه رو می نویسم و در محیطsql جدولی دارم برای اسنادم( کتاب و سی دی و مقاله و نامه و نشریه و............) که چندین ستون دارد مثل عنوان نوسنده زبان نوع گروه ناشر و .............
هر کدام از این اسناد نوعش در ستون ( نوع )مشخص شده (همون کتاب و مقاله و سی دی ......) و در ضمن زبان سندم هم مشخص شده (فارسی و لاتین )
ستون( نوع سند) کلید خارجی است که مقدارش را از یک جدول دیگه می گیره و ستون زبان هم nvarchar که مقدارش (فارسی و یا لاتین ) است
حالا بریم سراغ محیط سی شارپ :

من در بخشی از برنامه که کار جستجو را برای کاربر انجام می دهد چند تا چک باکس دارم که این ها نو ع و زبان سند دلخواه کاربر را چک می کنند مثلا چک باکس های من این طوریند:
کتابهای فارسی
کتابهای لاتین
سی دی های فارسی
سی دی های لاتین
مقالات فارسی
.
.
.
.
.
همانطور که پیداست در هرکدام از چک باکس ها نوع و زبان سند با هم چک خواهد شد
بعد به دنبال سند دلخواه کاربر می گردد و حالا در این جا مشکل من شروع می شود
من می خوام که رشته sql ای برای search بنویسم که اطلاعات یافته شده را دسته بندی شده به کاربر نمایش دهد مثلا بگو ید که چند تا کتاب فارسی پیدا کرده و یا چند تا سی دی لاتین پیدا کرده
انچه مهم است اینه که تعدادرا بگه و دسته بندی را انجام بدهد
اون چیزی که به ذهن من می رسه اینه که از رشته زیر استفاده کنم

select " my field" ,count (*) ………………………….. group by " my field"
اما این رشته یافته های مرا بر اساس فقط یک ستون و ان هم ستون "field " که یکی از ستون های جدول است مرتب خواهد کرد و با تعداد (زcount)نمایش می دهد
در حالی که من دو ستون را باید مورد بررسی قرار دهم ستون نوع سند و ستون ز بان
حالااز چه رشته ای استفاده کنم یا از چه ترفندی استفاده کنم یا چه تغییری در پایگاه و جدولم انجانم دهم تا بتونم این کار را انجام بدم؟
لطفا خیلی راهنمایی کنید
بسیار ممنون

آرام جان گل
پنج شنبه 07 تیر 1386, 21:23 عصر
یکی از دوستان کمی کمکم کرد و گفت که با where فیلتر کنم و بعد بر اساس هر کدوم از ستون ها که می خواهی دسته بندی کن (که من براساس نوع سند گروه بندی کردم) ولی کمک ایشان برای محیط سی شارپ کمکم نمی کنه
چون
طبق آنچه که قبلا گفتم من با چک باکس ها کار می کنم و این چک باکس ها دقیقا با هم فرق می کنن
یعنی اینکه مثلا من هم چک باکس (کتابهای فارسی ) دارم و هم چک باکس (کتابهای لاتین)

حالا اگر من براساس این رشته جستجو را انجام بدهم :
رشته من :

کد:


select T_ID , count (*) from Documents where (Languages = 'لاتین' and T_ID = 17)group by T_ID union select T_ID , count (*) from Documents where (Languages = 'فارسی' and T_ID = 17)group by T_ID

حالا خروجی این رشته :

کد:


T_ID count
17 3
17 1


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

شاید اگه توی جدولم در پایگاه یه کم تغییر ایجاد کنم مشکل حل بشه ولی نمی دونم چه تغییری

لطفا راهنمایی کنید
ممنون و مرسی

whitehat
جمعه 08 تیر 1386, 09:51 صبح
از کوئری زیر استفاده کنید


Select Language,count(*) From Documents
Where T_ID=17
Group By Language

آرام جان گل
شنبه 09 تیر 1386, 13:52 عصر
سلام


من یه بار دیگه خواسته ام را سعی می کنم واضح تر بگم

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

خوب آقای برنامه ساز من یه فرم جستجو برای کتابخانه ام می خوام
من یک فرم می خوام که یک تکست باکس داشته باشه برای وارد کردن آنچه کاربر به دنبال آن می گرده و یه دکمه تایید و یه باکسی (پانل)شامل چند تا چک باکس

هر کدام از این چک باکس ها باید دو مورد مهم از یک سند(که این سند می تونه کتاب یا سی دی یا مقاله یا نشریه یا .......) را در نظر بگیرند دقت کنید : زبان سند (فارسی یا لاتین) و نوع سند (کتاب . سی دی . مقاله .............)

مثلا من شش تا چک باکس دارم :
کتابهای فارسی یعنی (سند نوعش کتاب و زبانش فارسی باشد)
کتابهای لاتین " " "" "" "" "" لاتین ""
سی دی های فارسی " " "" "" سی دی و زبانش فارسی ""
سی دی ها لاتین
نشریه ها ی فارسی
نشریه های لاتین

حالا کمی از جدول پایگاه صحبت کنیم این جدول یک ستون بنام "زبان" دارد که زبان سند را می گوید و یک ستون دیگر به نام "نوع" که نوع سند را می گوید و کلید خارجی است و مقدارش را از جدول انواع می گیرد


خوب حالا من این طوری می نویسم :



if (checkbox1.Checked || checkbox2.Checked || checkbox3.Checked || checkbox4.Checked || checkbox5.Checked || checkbox6.Checked )
{
DataTable dt2 = new DataTable();
//if even one of checkboxes is true one by one check these checkboxes
string sql ="select Languages , count(*) as counts from documents where (Title like '%{0}%' or G_ID like '%{1}%' or Auther like '%{2}%' or Publisher like '%{3}%') and (";

if (checkbox1.Checked)
{
dt2 = db.docommand("select * from DocumentType where TName = 'کتاب' ");
string gid = dt2.Rows[0]["TID"].ToString();
sql += "(Languages = 'فارسی' and T_ID = " + gid + ")" + (checkbox2.Checked || checkbox3.Checked || checkbox4.Checked || checkbox5.Checked || checkbox6.Checked ? " or " : "") ;

}
if (checkbox2.Checked)
{
dt2 = db.docommand("select * from DocumentType where TName = 'کتاب' ");
string gid = dt2.Rows[0]["TID"].ToString();
sql += "(Languages = 'لاتین' and T_ID = " + gid + ")" + ( checkbox3.Checked || checkbox4.Checked || checkbox5.Checked || checkbox6.Checked ? " or " : "" );

}
if (checkbox3.Checked)
{
dt2 = db.docommand("select * from DocumentType where TName = 'سی دی' ");
string gid = dt2.Rows[0]["TID"].ToString();
sql += "Languages = 'فارسی' and T_ID = " + gid + ")" + ( checkbox4.Checked || checkbox5.Checked || checkbox6.Checked ? " or " : "");

}
if (checkbox4.Checked)
{
dt2 = db.docommand("select * from DocumentType where TName = 'سی دی' ");
string gid = dt2.Rows[0]["TID"].ToString();
sql +="Languages = 'لاتین' and T_ID = " + gid + ")" + ( checkbox5.Checked || checkbox6.Checked ? " or " : "");

}
if (checkbox5.Checked)
{
dt2 = db.docommand("select * from DocumentType where TName = 'نشریه' ");
string gid = dt2.Rows[0]["TID"].ToString();
sql += "Languages = 'فارسی' and T_ID = " + gid + ")"+( checkbox6.Checked ? " or " : "");

}
if (checkbox6.Checked)
{
dt2 = db.docommand("select * from DocumentType where TName = 'نشریه' ");
string gid = dt2.Rows[0]["TID"].ToString();
sql +="Languages = 'لاتین' and T_ID = " + gid + ")"
sql+= ") group by Languages";


اگر من براساس ستون language در حال مرتب سازی هستم چون می گم gorup by Language

حالا بگم چه اتفاقی می افته ؟ البته شما می دونید که چه اتفاقی می افته ولی این همون جایی است که همه بهش بی توجه هستن و در حقیقت مشکل منه
لطفا یه کم دقت کنید
داره ستون ها را براساس ستون Languages مرتب می کنه دقت دقت : تمام ستون ها یی که زبان شان مثل هم است را در یک گروه قرار می دهد همه سند هایی(کتاب. سی دی . مقاله و .........) که زبانشان یکسان است را در یک گروه قرار می دهد دقت دقت : در حالی که من می خواهم سند هایی که در یک نوع و یک زبان هستند در یک گروه قرار گیرند یعنی سندهای کتابی که زبان لاتین دارند در یک گروه باشند و
سند های کتابی که زبان فارسی دارند در یک گروه قرار گیرند و
.
.
.
.
.
.
.
این انتظار منه
البته شاید من بر سر این رشته ای که نوشته ام مشکل دارم یعنی این که شاید مشکل من با اصلح رشته حل بشه و یا با اصلاح جدولم و یا یه ترفند دیگه نمی دونم

فکر کنم دیگه کامل گفتم ان شاء ا....

حالا لطفا خیلی راهنمایی کنید

whitehat
یک شنبه 10 تیر 1386, 21:57 عصر
دوست عزیز کدی که شما نوشتید کمی مبهم است،مثلا اگر چک باکس 1 اگر تیک نخورد شما کوئری درستی نخواهید داشت، تا جاییکه من فهمیدم شما می خواهید بر اساس فیلد نوع (نشریه،کتاب و ...) و زبان (فارسی و لاتین) جستجو انجام دهید اما خروجی جستجو دقیقا چیه؟منظور شما از سند چیه؟ برای اینکه بشه جواب بهتری به شما داد ابتدا ساختار جدولها و سپس خروجی مورد نظر را بنویسید
(یک سوال داخل پرانتزی :آیا شما می توانید از SP استفاده کنید؟)

آرام جان گل
دوشنبه 11 تیر 1386, 23:32 عصر
سلام
کد من مبهم نیست . حالا تو ضیح می دهم .

خوب if اول : اگه حتی یکی از چک باکس ها تیک داشته باشد رشته ql باید بفهمد کدام بوده و طبق آن چک باکس رشته sql را کامل کند

آرام جان گل
دوشنبه 11 تیر 1386, 23:45 عصر
سلام
کد من مبهم نیست . حالا تو ضیح می دهم .

خوب if اول : اگه حتی یکی از چک باکس ها تیک داشته باشد رشته sql را شروع می کند یعنی چون با or نوشته شده کافی است که یکی از چک باکس ها چک بخورد و باید بفهمد کدام چک باکس بوده که چک خورده و طبق آن چک باکس رشته sql را کامل کند

حالا با if های بعدی مرتب صحت چک شده یا نشده چک باکس ها را بررسی می کند . و حالا سوال شما :

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

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

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


ساختار جدول :
مثلا شما فرض کنید جدولی دارم با ستون های زیر:
کلید اصلی از نوع int
نام سند از نوع nvarchar
نوع سند از نوع nvarchar
زبا ن سند از نوع nvarchar

حالا مثلا اگه کاربری به دنبال اسناد (کتاب(نوع)لاتین(زبان)) گشت به او تعداد یافته ها را نمایش دهد مثلا بگه 5 تا کتاب لاتین پیدا کردم

مرسی
راهنمایی کنید

whitehat
چهارشنبه 13 تیر 1386, 11:43 صبح
من فکر کردم if دوم خارج از if بالایی است!


حالا مثلا اگه کاربری به دنبال اسناد (کتاب(نوع)لاتین(زبان)) گشت به او تعداد یافته ها را نمایش دهد مثلا بگه 5 تا کتاب لاتین پیدا کردم
شما برای این کار کافیه ابتدا یک SubQuery درست کنید و تصمیم گیری های خود را بر اساس آن انجام دهید
این SubQuery بصورت زیر می تواند باشد


Select Type,Lanbguage,Count(*) As NumDoc From Documents
Group by Type,Language

حال بر اساس نیازتان می توانید از ان Query بگیرید یا حتی بر اساس دو فیلد join کنید، شما اگر دو چک باکس تیک بخورد آیا مجموع را نشان می دهید یا تعداد را بصورت جداگانه نشان می دهید؟