PDA

View Full Version : سوال: مشکل در دستور select در سی شارپ و SQL



misagh.sys
چهارشنبه 04 دی 1398, 12:46 عصر
با سلام خدمت دوستان و مهندسین بزرگوار
سوالی داشتم خدمتتون میخواستم لطف کنید و جواب بدین

نرم افزرای برای یک شرکت ساختمانی طراحی کردم که یکسری اطلاعات برای مثال نوع سقف ، نوع کفپوش و ....... به عنوان ورودی اولیه از کاربر دریافت میکنه
که جدول تمام اطلاعات پایه دو تا فیلد بیشتر نداره ID و subject

من در زمان ثبت سفارش فقط ID هر کدوم از پارامترهایی که نیاز داشته باشم را داخل جدول ثبت سفارش ذخیره میکنم اما عنوان را دحیره نمیکنم
الان موقع نمایش اطلاعات داخل دیتاگرید مشکل دارم
من ID رکوردهام را ذخیره کردم الان میخوام عنوان اون Id را داخل دیتاگرید موقع نمایش یا جستجوی سفارش بهم نشون بده

چکار باید بکنم ؟
اصلا کاری که کردم درست هست ؟

ممنن میشم جواب بدین

the king
چهارشنبه 04 دی 1398, 13:38 عصر
با سلام خدمت دوستان و مهندسین بزرگوار
سوالی داشتم خدمتتون میخواستم لطف کنید و جواب بدین

نرم افزرای برای یک شرکت ساختمانی طراحی کردم که یکسری اطلاعات برای مثال نوع سقف ، نوع کفپوش و ....... به عنوان ورودی اولیه از کاربر دریافت میکنه
که جدول تمام اطلاعات پایه دو تا فیلد بیشتر نداره ID و subject

من در زمان ثبت سفارش فقط ID هر کدوم از پارامترهایی که نیاز داشته باشم را داخل جدول ثبت سفارش ذخیره میکنم اما عنوان را دحیره نمیکنم
الان موقع نمایش اطلاعات داخل دیتاگرید مشکل دارم
من ID رکوردهام را ذخیره کردم الان میخوام عنوان اون Id را داخل دیتاگرید موقع نمایش یا جستجوی سفارش بهم نشون بده

چکار باید بکنم ؟
اصلا کاری که کردم درست هست ؟

ممنن میشم جواب بدین
شما هم می توانید موقع خواندن از پایگاه داده با دستور SQL اون ID رو با Subject اش جایگزین کنید (INNER JOIN) و هم می توانید موقع نمایش در DataGridView تبدیل رو انجام بدید.
برای تبدیل سریع id به subject در کدتون می توانید یک <Dictionary<int, string تعریف کنید که ابتدای برنامه همه اون id ها و subject شون رو ذخیره کنه تا موقع نمایش سریع id بگیره و subject تحویل بده.
مثلا :

private Dictionary<int, string> _subjects = new Dictionary<int, string>();

private void Form1_Load(object sender, EventArgs e)
{
var dataTable = new DataTable();

// Fill DataTable...

foreach (DataRow row in dataTable.Rows)
{
_subjects.Add((int)row["id"], (string)row["subject"]);
}
}


و در DataGridView شما می توانید مشخص کنید که میخوام در ستون فلان (مثلا ستون اندیس 1) بجای id که واقعا قرار دادم، فلان عبارت string، مثلا subject اش نمایش داده بشه :

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 1)
{
string subject;
if (_subjects.TryGetValue(int.Parse(e.Value.ToString( )), out subject) == false)
{
subject = "نامشخص";
}
e.Value = subject;
e.FormattingApplied = true;
}
}

misagh.sys
چهارشنبه 04 دی 1398, 13:53 عصر
سلام
ممنون از وقتی که گذاشتی
امکانش هست بیشتر توضیح بدی ؟
من درست متوجه نشدم

misagh.sys
چهارشنبه 04 دی 1398, 13:56 عصر
دوست عزیز
برای مثال من سه تا جدول اطلاعات پایه دارم
1 - کفپوش -> با فیلد های ID و subject
2-نوع سقف -> با فیلدهای ID و subject
3-نوع کابینت -> با فیلدهای ID و subject
هر کدوم از این جداول چندین رکورد دارند
من آی دی مورد نظرم را از هر کدوم از این جدوال گرفتم و داخل جدول ثبت سفارش ذخیره کردم
حالا میخوام موقع نمایش سفارش داخل دیتا گریدویو بجای نمایش شماره ِآی دی عنوانی که واسشون قبلا در بخش اطلاعات پایه ذخیره کردم نمایش بده

the king
چهارشنبه 04 دی 1398, 14:05 عصر
دوست عزیز
برای مثال من سه تا جدول اطلاعات پایه دارم
1 - کفپوش -> با فیلد های ID و subject
2-نوع سقف -> با فیلدهای ID و subject
3-نوع کابینت -> با فیلدهای ID و subject
هر کدوم از این جداول چندین رکورد دارند
من آی دی مورد نظرم را از هر کدوم از این جدوال گرفتم و داخل جدول ثبت سفارش ذخیره کردم
حالا میخوام موقع نمایش سفارش داخل دیتا گریدویو بجای نمایش شماره ِآی دی عنوانی که واسشون قبلا در بخش اطلاعات پایه ذخیره کردم نمایش بده
متوجه شدم. شما ابتدای اجرای برنامه تون باید مشخصات جداول پایه، سه تا جدول یا بیشتر، فرقی نمی کنه، رو بخونید و داده هاشون که میگه id فلان متناظر عنوان بهمان میشه رو در اون subjects_ فراخوانی کنید، یعنی subjects_ با این داده ها پر میشه.
مثلا میگه ID ئه 123 متناظر هست با "کفپوش مدل فلان"
از اون به بعد که مساله نمایش داخل DataGridVew هست، شما id که یک عدد ئه رو در ستون قرار می دهید که اینجا اگر کار اضافی انجام نمی دادید همون id عددی رو هم در ستون نشون میده.
ولی ما چون در رخداد CellFormatting اون DataGridView دستکاری می کنیم، بجای id همون عنوان متناظرش رو از داخل subjects_ پیدا میکنه و نمایش میده. subjects_ دیکشنری ئه و برای همین سرعت جستجو کردنش بالا است.

misagh.sys
چهارشنبه 04 دی 1398, 15:08 عصر
گرفتم چی شد
فقط یه سوال دیگه اینکه Datatable را چطور پر بکنم که از چه جدولی دیتا را بخونه ؟

misagh.sys
چهارشنبه 04 دی 1398, 16:12 عصر
دوستان ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

the king
چهارشنبه 04 دی 1398, 16:59 عصر
گرفتم چی شد
فقط یه سوال دیگه اینکه Datatable را چطور پر بکنم که از چه جدولی دیتا را بخونه ؟
نمیدونم پایگاه داده تون چیه و از چی میخونید، در اغلب موارد نیازی نیست DataTable پر بشه، چون DataTable یک واسطه است و میشه بجاش از SqlDataReader استفاده کرد، مثل مثال اینجا (https://barnamenevis.org/showthread.php?517859-%D8%AA%D8%AD%D9%84%DB%8C%D9%84-%DA%A9%D8%AF&p=2301240&viewfull=1#post2301240)، اما به هر حال مثلا در مورد SQL Server شما یک شیء SqlDataAdapter میسازید که یک دستور کوئری ئه SQL میخواد و یک ConnectionString که وصل بشه به پایگاه داده فلان. بعد این SqlDataAdpater تون یک متد Fill داره که با اون DataTable رو پر می کنید با داده هایی که توسط کوئری Select شدن. مثلا این پست (https://barnamenevis.org/showthread.php?537671-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-textbox-%D8%A8%D9%87-%D8%AC%D8%AF%D9%88%D9%84-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-sql&p=2364961&viewfull=1#post2364961) رو ببینید. یک SqlDataAdapter میسازه و توسط اون DataTable رو Fill می کنه با داده ها.

misagh.sys
شنبه 07 دی 1398, 12:38 عصر
خیلی ممون دوست عزیز:قلب::قلب::قلب::قلب::قلب: