PDA

View Full Version : سوال: Data set و Data Adapter



mehran63
سه شنبه 13 مهر 1389, 12:53 عصر
سلام


SqlCommand com=new SqlCommand();
DataSet ds = new DataSet();
string str = "Data Source=نام سرور;initial Catalog=نام دیتابیس;Integrated Security=True";
con.ConnectionString=str;
com.Connection=con;
com.CommandText="select * from نام جدول";
da.SelectCommand=com;
da.Fill(ds);
dataGridView1.DataSource=ds.Tables[0];
con.Close();


اگه امکان داره یه توضیحی در مورد Data set یا همون ds و همینطور Data Adapter و () da.fill و
[0] ds.Table که چه کاری دارن تو این سورس و در کل انجام میدن به هم بدین
و چگونه با کلیک روی یک command Button داده را از text Box به بانک انتقال بدهم
اگه یه کد مثل کد بالا هم گذاشتین که خیلی عالی میشه

AmirAmiri
سه شنبه 13 مهر 1389, 13:14 عصر
سلام دوست عزیز.
خب باید خیلی خلاصه بگم که DataSet مجموعه ای از DataTable هاست.
حالا DataTable چیه؟ DataTable شی ای هست که یک جدول رو درون خودش نگهداری میکنه مثلا شما توی SQL میزنی
SELECT * FROM master حالا این دستور به شما یک جدول برمیگردونه و این جدول باید توی برنامه شما یک جایی ذخیره بشه یا Load بشه که وظیفه نگهداری این جدول بر عهده DataTable هست و وظیفه Load کردن این جدول درون DataTable هم بر عهده DataAdapter یا همون da هست. زمانی که شما از دستور Fill استفاده میکنی، DataAdapter دستورات داخل cmd رو به SQL ارسال میکنه و جواب رو در قالب یک جدول دریافت میکنه بعد جواب رو میریزه توی همون DataTable.

اما ds یا همون DataSet چیه؟
فرض کنید توی برنامه نیاز دارید که چندین جدول رو به کار ببرید میتونید از دو روش استفاده کنید.
اول اینکه چندین DataTable تعریف کنید :


DataTable dt_Master = new DataTable();
DataTable dt_Users = new DataTable();
.
.
.
DataTable dt_myTable = new DataTable();
.
.
da.Fill(dt_Master);
اینکار برای تعداد زیاد Table ها کمی نا معقوله پس باید از شی ای استفاده کرد که مجموعه ای (آرایه ای) از DataTable هاست. این شی DataSet هست.
کد بالا معادله کد زیر هستش:


DataSet ds = new DataSet();
ds.Table.Add("dt_Master");
ds.Table.Add("dt_Users");
.
.
.
ds.Table.Add("dt_myTable");
.
.
da.Fill(ds.Table["dt_Master]);
از DataSet به دو روش میتونی استفاده کنی :
اول همون روش ایندکس که شماره جدول رو بهش میدی مثل :

da.Fill(ds.Table[0]);دوم استفاده از نام جدول مثل همون مثالی که من زدم.

در اینجا da دستورات رو اجرا کرده و اطلاعات رو از Data Base واکشی میکنه و اونارو توی جدولی که بهش میدیم میریزه. اون جدول باید از نوع DataTable باشه فرقی هم نمیکنه که از متغیر DataTable استفاده کنی یا از متغیر DataSet استفاده کنی.
در واقع DataSet مثل استفاده از آرایه ها میمونه.
دو دستور زیر با هم هیچ فرقی ندارن:


1:
String a;
a = "Hello";

2:
String[] a = new String[10];
a[0]="Hello";
امیدوارم خوب متوجه شده باشی.
موفق و پیروز باشی.

mehran63
سه شنبه 13 مهر 1389, 13:30 عصر
ممنون از این پاسخ
ولی نگفتی چه جوری داده ها رو از Text Box به بانک اضافه کنم

AmirAmiri
سه شنبه 13 مهر 1389, 13:35 عصر
ممنون از این پاسخ
ولی نگفتی چه جوری داده ها رو از Text Box به بانک اضافه کنم

خواهش میکنم.
خیلی ساده با استفاده از دستورات SQL میتونی اینکارو بکنی.
یک نمونه مثال میزنم.


cmd.CommandText = "INSERT INTO myTable(FName, LName, Tel, Gender) VALUES('"
+ txtFName.Text + "','"
+ txtLName.Text + "','"
+ txtTel.Text + "',"
+ cmbGender.SelectedIndex.ToString();
cmd.ExecuteNonQuery();

mehran63
سه شنبه 13 مهر 1389, 13:51 عصر
این راه خیلی خوب و فکر کنم تنها راه اصولی هم باشه ولی راه دیگه ای هم هست
مثلا در VB6 از adodc استفاده میکردیم
در ضمن برای Delete و Update و ... هم میتوان از همین روش که شما نوشتید استفاده کرد و فقط دستورات رو تو " " دابل کوتیشن گذاشت ؟

AmirAmiri
سه شنبه 13 مهر 1389, 13:57 عصر
این راه خیلی خوب و فکر کنم تنها راه اصولی هم باشه ولی راه دیگه ای هم هست
مثلا در VB6 از adodc استفاده میکردیم
در ضمن برای Delete و Update و ... هم میتوان از همین روش که شما نوشتید استفاده کرد و فقط دستورات رو تو " " دابل کوتیشن گذاشت ؟

بله دوست عزیز برای تمامه دستورا میشه از همین روa استفاده کرد و هیچ محدودیتی نداره.

مثلا برای Delete :


cmd.CommandText = "DELETE FROM myTable WHERE ID = " + intID.ToString();
cmd.ExecuteNonQuery();
یا مثلا :


cmd.CommandText = "DELETE FROM myTable WHERE Gender = 1";
cmd.ExecuteNonQuery();
و برای ویرایش هم :


cmd.CommandText = "UPDATE myTable SET FName='"
+ txtFName.Text + "' WHERE ID=" + intID.ToString();
cmd.ExecuteNonQuery();