PDA

View Full Version : سوال: درج اطلاعات بر اساس چند جدول دیگر



sattar1
چهارشنبه 01 شهریور 1391, 13:01 عصر
سلام به تمام بازدید کنندگان عزیز و گرامی



بنده تاپیکی با عنوان " ایجاد پایگاه داده SQL بدون نصب SQL Server" به آدرس


http://barnamenevis.org/showthread.php?357409-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-SQL-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%D8%B5%D8%A8-SQL-Server


ایجاد کرده ام و توضیحات نسبتا کاملی را در آن شرح دادم.



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



بنده با پروژه های دانشجویی زیادی سروکله زدم و اکثر آنها بدین صورت برنامه نویسی میکنند که :

"یک پایگاه داده ساخته شده و چند جدول" اما نکته اینجاست که ارتباطات بین جداول صورت نگرفته است.


مثلا فرض کنید 2جدول به نام های "بیمار" و "نوع بیمه" داریم.

فیلد های جدول بیمار : "sh parvande" -"name" - "noe bime"

فیلد های جدول نوع بیمه : " id noe bime" - " noe bime"

اغلب بدین صورت برنامه نویسی میکنند و به جای اینکه بین این 2جدول کلید خارجی تعیین کنند و ارتباطات لازم را ایجاد کنند، آن را به همین شکل ادامه میدهند.

در صورتی که هدف اصلی از ایجاد چند جدول، کاهش اطلاعات پایگاه است.

پس باید جداول فوق بدین صورت درآید:

فیلد های جدول بیمار : "sh parvande" -"name" - " id noe bime"

فیلد های جدول نوع بیمه : " id noe bime" - " noe bime"

اکنون ما به وسیله ی " id noe bime" بین دو جدول ارتباط برقرار میکنیم.


اما سوال بنده

من برای درج اطلاعات و نمایش آن در DataGrideView برای یک جدول اصلا مشکلی ندارم.

مشکل سر درج اطلاعات و نمایش آن در DataGrideView برای چند جدول است.



برای این امر پروژه ای را به تاپیک اضافه میکنم و از دوستان کاربلد تقاضای تکمیل آن و یا کمک برای به نتیجه رسیدن آن را دارم.



توجه : روش ایجاد این پروژه دقیقا مانند مراحل طی شده در تاپیک " ایجاد پایگاه داده SQL بدون نصب SQL Server " است.


نام پایگاه : DataBimar.mdf

نام جداول و فیلدها :

91678



توجه : نیازی به اتچ نیست.


سوال یک : چگونه آیتم های زیر را در DataGrideView نمایش دهیم:

" sh parvande" و " name" و " noe bime" و "sex"

توجه: اگر که جواب شما INNER JOIN کردن جداول است. بنده این عمل را بلدم اما چگونگیه نوشتن کد اتصال بهDataGrideView را نمیدانم.


کد مربوط به INNER JOIN:

SELECT bimar.[sh parvande], bimar.name, [noe bime].[noe bime], sex.sex
FROM bimar
[INNER JOIN [noe bime] ON bimar.[id noe bime] = [noe bime].[id noe bime
[INNER JOIN sex ON bimar.[id sex] = sex.[id sex



91680


سوال دوم: چگونگی درج اطلاعات :

این فرم را در نظر بگیرید. چطور عمل کنیم که وقتی "نوع بیمه" را "خدمات درمانی" انتخاب کردیم پس از درج اطلاعات کد مربوط به "خدمات درمانی" در جدول بیمار ثبت شود.


91681
توجه: همان طور که ذکر نمودم برای درج در یک جدول مشکلی نیست.

مثلا

Query نوشته شده :

[INSERT INTO [noe bime
([id noe bime], [noe bime])
(VALUES (@id_noe_bime,@noe_bime




کد نوشته شده برای دکمه ی درج اطلاعات :


private void button1_Click(object sender, EventArgs e)
{

noe_bimeTableAdapter.InsertQuery(Convert.ToInt32(t extBox1.Text.ToString()), textBox2.Text.ToString());
this.noe_bimeTableAdapter.Fill(this.dataSet1.noe_b ime);

}


دانلود پروژه :

http://www.mediafire.com/?1b1w3oh54ppe2c5



شرمنده بابت اینکه مطلب طولانی شد

با سپاس

sattar1
چهارشنبه 01 شهریور 1391, 19:00 عصر
بدجور دنبال به نتیجه رسیدن این مسئله هستم اما تا الان نتیجه بخش نبوده

تا الان 32 بازدید شده از این تاپیک اما بدون هیچ نظری

veniz2008
چهارشنبه 01 شهریور 1391, 19:31 عصر
سلام. سوال اولتون : اگه یه select ساده انجام داده باشید و نتیجه رو توی گرید نمایش داده باشید؛ واسه این مورد هم هیچ مشکلی نخواهید داشت. حالا میخواد 2 جدول باشه یا بیشتر. شما نتیجه این select رو بریز در یه datatable و بعد این دیتاتیبل رو به خاصیت دیتاسورس از گرید ویو نسبت بده.
سوال دوم : شما باید از خاصیت selectedvalue مربوط به کمبوباکس استفاده کنید تا id مربوط به اون موردی که کاربر انتخاب میکنه رو بدست بیاری.

sattar1
چهارشنبه 01 شهریور 1391, 20:37 عصر
سلام. سوال اولتون : اگه یه select ساده انجام داده باشید و نتیجه رو توی گرید نمایش داده باشید؛ واسه این مورد هم هیچ مشکلی نخواهید داشت. حالا میخواد 2 جدول باشه یا بیشتر. شما نتیجه این select رو بریز در یه datatable و بعد این دیتاتیبل رو به خاصیت دیتاسورس از گرید ویو نسبت بده.
سوال دوم : شما باید از خاصیت selectedvalue مربوط به کمبوباکس استفاده کنید تا id مربوط به اون موردی که کاربر انتخاب میکنه رو بدست بیاری.

بسیار ممنون از توضیحتون
بنده عمل select ساده رو انجام دادم و اون رو توی گرید نمایش دادم اما به صورت ویزاردی. به نظرم برای چندتا جدول باید کدنویسی کرد و به صورت ویزاردی جواب نمیده (یا من بلد نیستم)
کمی بیشتر توضیح میدهید
چطور میشه "نتیجه select رو در یه datatable ریخت و بعد این دیتاتیبل رو به خاصیت دیتاسورس از گرید ویو نسبت داد" یعنی باید در پایگاه یک جدول جدید درست کنم؟
در ضمن کار با "خاصیت selectedvalue" چگونه است.

sattar1
چهارشنبه 01 شهریور 1391, 21:07 عصر
جناب mohammaddou (http://barnamenevis.org/member.php?155296-mohammaddou) احسن
مشکل دوم حل شد

روش :
ابتدا comboBox را به جدول اتصال میدهیم (بایند میکنیم)
سپس خصوصیت valuemember رو برابر آیدی مورد نظر قرار داده و در آخر در دکمه ی درج مینویسیم :

Convert.ToInt32(comboBox1.SelectedValue.ToString()

دوستان برای مشکل اول راهنمایی میکنید؟؟؟؟

veniz2008
چهارشنبه 01 شهریور 1391, 23:50 عصر
برای inner join کردن به مثال زیر توجه کن:
سه تا جدول users ، car و Feature رو بصورت مقابل در نظر بگیرید: یک: جدول users (کاربران) شامل : iduser،firstname,lastname,address .که iduser کلید جدول هستش. دو: جدول car (اتومبیل) شامل : iduser و idcar که idcar کلید اصلی و iduser کلید خارجی هستش. سه: جدول Feature ( ویژگی ها) شامل idcar,color,model,factory که idcar همزمان نقش کلید اصلی و کلید خارجی رو داره. حالا قصد دارم که با وارد کردن کد مشتری(iduser) مشخصات مشتری و اتومبیلی که به نام مشتری هست رو بدست بیارم. یعنی از 3 جدول خروجی بگیرم و درون گریدویو نمایش بدم. بسادگی با کد زیر اینکار رو انجام میدیم:
برای استفاده از inner join ابتدا نام تمامی فیلدهایی که میخواهیم نمایش بدیم رو ذکر میکنیم ( قبل از نام فیلد بایستی نام جدول رو بیاری مثلا users.firstname ) بعد از آن دو به دو جدول هایی رو که با هم در ارتباطند(یعنی فیلد مشترک دارند) رو به هم متصل میکنیم. بصورت زیر :

SqlConnection con = new SqlConnection("Data Source = (local);Initial Catalog = KHODRO; Integrated Security = True");
SqlCommand cmd = new SqlCommand("select Users.IDUser,Users.FirstName,Users.LastName,Users. Address,Car.IDCar,Feature.Color,Feature.Model,Feat ure.Factory from Users inner join Car on Users.IDUser = Car.IDUser inner join Feature on Car.IDCar = Feature.IDCar where Users.IDUser = @iduser",con);
cmd.Parameters.AddWithValue("@iduser", txtiduser.Text.Trim());
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;

sattar1
پنج شنبه 02 شهریور 1391, 12:40 عصر
دوست عزیز ابتدا از توضیح دقیق و کامل شما ممنونم

اما من دنبال راهی هستم که از "SqlConnection" استفاده نکنم

به عنوان مثال برای درج اطلاعات در جدول "sex" که دارای فیلدهای "id sex" و "sex" است اینگونه Query نوشتم :


INSERT INTO sex
([id sex], sex)
;(VALUES (@id_sex,@sex


سپس در دکمه ی درج :


sexTableAdapter.InsertQuery(Convert.ToInt32(textBo x1.Text.ToString()), textBox2.Text.ToString());
this.sexTableAdapter.Fill(this.dataSet1.sex);


و یا برای Select :
Query :

SELECT [id sex], sex FROM dbo.sex


و برای فراخوانی اش نوشتم:


this.sexTableAdapter.Fill(this.dataSet1.sex);



اما برای Inner Join


در قسمت Query نوشتم:


91724

جداول به درستی Join میشوند
اما مشکل من چگونگی اتصال این Query به DataGridView است؟؟؟؟؟؟؟

sattar1
پنج شنبه 02 شهریور 1391, 19:22 عصر
جناب mohammaddou (http://barnamenevis.org/member.php?155296-mohammaddou) احسن
مشکل دوم حل شد

روش :
ابتدا comboBox را به جدول اتصال میدهیم (بایند میکنیم)
سپس خصوصیت valuemember رو برابر آیدی مورد نظر قرار داده و در آخر در دکمه ی درج مینویسیم :

Convert.ToInt32(comboBox1.SelectedValue.ToString()

دوستان برای مشکل اول راهنمایی میکنید؟؟؟؟

دوستان عزیز

کسی بلده چطور میشه با کد نویسی (نه ویزاردی) مقدار valueMember کمبوباکس رو برابر id قرار داد؟

منظورم ی چیزی مثله اینه :
comboBox1.ValueMember = "id_sex";

sattar1
پنج شنبه 02 شهریور 1391, 19:30 عصر
برای inner join


SqlConnection con = new SqlConnection("Data Source = (local);Initial Catalog = KHODRO; Integrated Security = True");
SqlCommand cmd = new SqlCommand("select Users.IDUser,Users.FirstName,Users.LastName,Users. Address,Car.IDCar,Feature.Color,Feature.Model,Feat ure.Factory from Users inner join Car on Users.IDUser = Car.IDUser inner join Feature on Car.IDCar = Feature.IDCar where Users.IDUser = @iduser",con);
cmd.Parameters.AddWithValue("@iduser", txtiduser.Text.Trim());
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;

"مغزم دیگه نمیکشه" بیخیال
mohammaddou جان همین روش شما رو رفتم
ام ی مشکلی هست.
کدها هیچ خطایی نمیدن و ستونهای مورد نظر هم به DataGrideView اضافه میشن ولی مقداری توشون نشون نمیده - خالیه!!!:گیج:

Mahmoud.Afrad
پنج شنبه 02 شهریور 1391, 20:29 عصر
برای اینکه ویزاردی این کار رو انجام بدی داخل دیتاست جایی که دیتاتیبل ها اضافه شده راست کلیک و یک tableAdapter اضافه کن و دستور join را بنویس و ادامه بده تا دیتاتیبل حاصل از join به دیتاست اضافه بشه. بعد راحت میتونی این دیتاتیبل را از طریق باندینگ سورس دیتاگریدویو بهش بایند کنی(مثل حالتهای قبلی که انجام دادی)


اگر id داخل دیتابیس از نوع عددی هست نیازی به تبدیل به رشته و بعد دوباره تبدیل به عدد نیست خود selectedValue از نوع عددی خواهد بود.

از طریق کدنویسی هم طبق همونی که خودت نوشتی میشه valueMember را تعیین کرد. comboBox1.ValueMember = "id_sex";



در ضمن ، ایجاد پایگاه داده بدون نصب sqlserver یعنی چی؟!!!!! اگر بدون نصب sqlserver بود که نمیتونستی پایگاه داده ایجاد کنی.

sattar1
جمعه 03 شهریور 1391, 10:00 صبح
اگر id داخل دیتابیس از نوع عددی هست نیازی به تبدیل به رشته و بعد دوباره تبدیل به عدد نیست خود selectedValue از نوع عددی خواهد بود.

از طریق کدنویسی هم طبق همونی که خودت نوشتی میشه valueMember را تعیین کرد. comboBox1.ValueMember = "id_sex";



ممنون از پاسخ شما



در ضمن ، ایجاد پایگاه داده بدون نصب sqlserver یعنی چی؟!!!!! اگر بدون نصب sqlserver بود که نمیتونستی پایگاه داده ایجاد کنی.
بله دوست عزیز ی جورایی این عنوان ابهام داره.
منظورم اینه که نیازی به نصب جداگانه ی Sql Server نیست (چون اکثرا برای بار اول تو نصبش به مشکل میخورن) و میشه از Sql Express خود Visual studio استفاده کرد.

به طور کلی :


تفاوت بانک ایجاد شده در Sql Express با Sql Server ؟

Sql Express در واقع نسخه رایگان Sql Server هست که به عنوان یک بسته با Visual Studio ارائه شده.

Sql Express بسیاری از امکانات Sql Server رو به همراه داره.

سبک بودن Sql Express یکی از مزیت های اون به حساب میاد. چون موقع ایجاد برنامه نصب به راحتی میتوان Package مربوط به آن را در کنار دیگر فایل های برنامه جای داد.

Sql Express برای برنامه های کوچک گزینه ی کاملا مناسبی است اما برای برنامه های نسبتا بزرگ، مناسب نیست دلیلش هم مقدار کم بودن Ram آن نسبت به Sql Server است.

sattar1
جمعه 03 شهریور 1391, 10:25 صبح
برای اینکه ویزاردی این کار رو انجام بدی داخل دیتاست جایی که دیتاتیبل ها اضافه شده راست کلیک و یک tableAdapter اضافه کن و دستور join را بنویس و ادامه بده تا دیتاتیبل حاصل از join به دیتاست اضافه بشه. بعد راحت میتونی این دیتاتیبل را از طریق باندینگ سورس دیتاگریدویو بهش بایند کنی(مثل حالتهای قبلی که انجام دادی)


ایول، این همون راهی بود که دنبالش بودم. نسبت به قبل خیلی مبحث جلو رفت.اما باز مشکل دیگری شکل گرفت.
این بار DataGridView دقیقا ستون های مورد نیاز را به همراه اطلاعاتش نمایش میدهد اما وقتی که اطلاعاتی در جدول مثلا بیمار ثبت میشود، این اطلاعات جدید ثبت شده در جدول Inner Join شده نمی آید.
به همین صورت اگر که اطلاعاتی در جدول Inner Join شده ثبت شود این بار اطلاعات جدید ثبت شده در جدول بیمار نمی آید.

کد درج در جدول بیمار:
bimarTableAdapter1.InsertQuery(Convert.ToInt32(tex tBox1.Text.ToString()), textBox2.Text.ToString(), Convert.ToInt32(comboBox2.SelectedValue.ToString() ), Convert.ToInt32(comboBox1.SelectedValue.ToString() ));

کد درج در جدول Inner Join شده:
dataTable1TableAdapter.InsertQuery(Convert.ToInt32 (textBox1.Text.ToString()), textBox2.Text.ToString(), Convert.ToInt32(comboBox2.SelectedValue.ToString() ), Convert.ToInt32(comboBox1.SelectedValue.ToString() ));


91756



91757



91758


this.dataTable1TableAdapter.Fill(this.dataSet1.Dat aTable1);
این کد در فرم لود واقع است.


پروژه مربوطه را ضمیمه کردم.
http://www.mediafire.com/?bu6xkerbxk11rpn


لطفا دوستان کمک کنن

Mahmoud.Afrad
جمعه 03 شهریور 1391, 17:05 عصر
شما نمیتونید به یک join یا view عمل درج را انجام بدید. پس عمل درج به جدولهایی باید انجام بشه که معادلشون در دیتابیس موجود هست نه دیتاتیبلی که معادلی در دیتابیس نداره. پس عمل درج را به جدول های دیگر انجام بدید و بعد دیتاتیبل حاصل از join را دوباره fill کنید.

sattar1
جمعه 03 شهریور 1391, 20:45 عصر
شما نمیتونید به یک join یا view عمل درج را انجام بدید. پس عمل درج به جدولهایی باید انجام بشه که معادلشون در دیتابیس موجود هست نه دیتاتیبلی که معادلی در دیتابیس نداره. پس عمل درج را به جدول های دیگر انجام بدید و بعد دیتاتیبل حاصل از join را دوباره fill کنید.

دوست عزیز بنده همین مورد هم امتحان کردم اما نشد.
ولی مشکل رو پیدا کردم. مشکل از Connection نشدن صحیح در TableAdapter ایجاد شده بود.

بسیاررررررر ممنون از شما:قلب:

m.batimar
جمعه 17 شهریور 1391, 10:15 صبح
سلام دوستان عزیز منم مثل دوستمون دوتا جدول تو پایگاه داده ام دارم که تو برنامم کامل درج میکنه ولی فیلدای هر دو جدول رو کامل در دیتاگریدویو نمایش نمیده.... من این پاسخ خای دوستان رو خوندم ولی کامل متوجه نشدم لطفا راهنماییم کنید( از join تو select هم استفاده کردم ولی جواب نگرفتم)

nazi89
چهارشنبه 25 دی 1392, 12:12 عصر
سلام به تمام بازدید کنندگان عزیز و گرامی



بنده تاپیکی با عنوان " ایجاد پایگاه داده SQL بدون نصب SQL Server" به آدرس


http://barnamenevis.org/showthread.php?357409-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-SQL-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%D8%B5%D8%A8-SQL-Server


ایجاد کرده ام و توضیحات نسبتا کاملی را در آن شرح دادم.



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



بنده با پروژه های دانشجویی زیادی سروکله زدم و اکثر آنها بدین صورت برنامه نویسی میکنند که :

"یک پایگاه داده ساخته شده و چند جدول" اما نکته اینجاست که ارتباطات بین جداول صورت نگرفته است.


مثلا فرض کنید 2جدول به نام های "بیمار" و "نوع بیمه" داریم.

فیلد های جدول بیمار : "sh parvande" -"name" - "noe bime"

فیلد های جدول نوع بیمه : " id noe bime" - " noe bime"

اغلب بدین صورت برنامه نویسی میکنند و به جای اینکه بین این 2جدول کلید خارجی تعیین کنند و ارتباطات لازم را ایجاد کنند، آن را به همین شکل ادامه میدهند.

در صورتی که هدف اصلی از ایجاد چند جدول، کاهش اطلاعات پایگاه است.

پس باید جداول فوق بدین صورت درآید:

فیلد های جدول بیمار : "sh parvande" -"name" - " id noe bime"

فیلد های جدول نوع بیمه : " id noe bime" - " noe bime"

اکنون ما به وسیله ی " id noe bime" بین دو جدول ارتباط برقرار میکنیم.


اما سوال بنده

من برای درج اطلاعات و نمایش آن در DataGrideView برای یک جدول اصلا مشکلی ندارم.

مشکل سر درج اطلاعات و نمایش آن در DataGrideView برای چند جدول است.



برای این امر پروژه ای را به تاپیک اضافه میکنم و از دوستان کاربلد تقاضای تکمیل آن و یا کمک برای به نتیجه رسیدن آن را دارم.



توجه : روش ایجاد این پروژه دقیقا مانند مراحل طی شده در تاپیک " ایجاد پایگاه داده SQL بدون نصب SQL Server " است.


نام پایگاه : DataBimar.mdf

نام جداول و فیلدها :

91678



توجه : نیازی به اتچ نیست.


سوال یک : چگونه آیتم های زیر را در DataGrideView نمایش دهیم:

" sh parvande" و " name" و " noe bime" و "sex"

توجه: اگر که جواب شما INNER JOIN کردن جداول است. بنده این عمل را بلدم اما چگونگیه نوشتن کد اتصال بهDataGrideView را نمیدانم.


کد مربوط به INNER JOIN:

SELECT bimar.[sh parvande], bimar.name, [noe bime].[noe bime], sex.sex
FROM bimar
[INNER JOIN [noe bime] ON bimar.[id noe bime] = [noe bime].[id noe bime
[INNER JOIN sex ON bimar.[id sex] = sex.[id sex



91680


سوال دوم: چگونگی درج اطلاعات :

این فرم را در نظر بگیرید. چطور عمل کنیم که وقتی "نوع بیمه" را "خدمات درمانی" انتخاب کردیم پس از درج اطلاعات کد مربوط به "خدمات درمانی" در جدول بیمار ثبت شود.


91681
توجه: همان طور که ذکر نمودم برای درج در یک جدول مشکلی نیست.

مثلا

Query نوشته شده :

[INSERT INTO [noe bime
([id noe bime], [noe bime])
(VALUES (@id_noe_bime,@noe_bime




کد نوشته شده برای دکمه ی درج اطلاعات :


private void button1_Click(object sender, EventArgs e)
{

noe_bimeTableAdapter.InsertQuery(Convert.ToInt32(t extBox1.Text.ToString()), textBox2.Text.ToString());
this.noe_bimeTableAdapter.Fill(this.dataSet1.noe_b ime);

}


دانلود پروژه :

http://www.mediafire.com/?1b1w3oh54ppe2c5



شرمنده بابت اینکه مطلب طولانی شد

با سپاس

مرسی از آموزش خوبت من تا قسمت 17. کد لازم برای دکمه ی درج : آموزش قبلیت پیش رفتم اطلاعات که واردمیکنم تو جدول تو فرم هم میاد ولی تو دیتابیس ذخیره نمیشه یعنی وقتی دوباره از نو پروژه را اجرا میکنم تو جدول نیست ...تورو به خدا یکی کمک کنه کارم خیلی گیره
یه منبع آموزشی هم واسه کار با دیتابیس تو Visual Studio 2010 معرفی کنید ممنون میشه

کاربر مبتدی
یک شنبه 18 خرداد 1393, 16:24 عصر
با تشکر از سوال خوبتون من چند سورس کد دانلود کردم ولی هیچکدوم مدل رابطه ای نیست و جداولشون تخت و بدون اتصال به جداول دیگس میخواستم بدونم کسی سورس کد مدل رابطه ای مخصوصاً حسابداری سراغ نداره ما یه چی یاد بگیریم؟:قلب: