تفاوت دیتاتیبل DataTable و دیتاست Dataset

DataSet مجموعی از DataTableها است .
خوب دیگه فرقها و شباهت هایش هم معلومه ... اما در رابطه با موارد استفاده با توجه به برنامه خودتون باید به صورت تجربی به دست آورید . و فقط به این موضوع توجه داشته باشید که سرعت در DataTable بیشتر است.

dataset همون طور که از نامش پیداست یک منبعی هست برای ذخیره داده ها
این داده ها میتونن
datatable
view
یا هر شیی باشن
datatable هم که برای ذخیره اطلاعا ت جدول هست

مثال: DataTable میشه جدول یک دیتابیس و Dataset میشه دیتابیس ما بدون مکان فیزیکی یعنی توی حافظه.

شما در یک پروژه ویندوزی برای Bind کردن و نمایش اطلاعات ناگزیر به استفاده از dataset هستید(حداقل برای رهایی از کدنوشتن های اضافی و بیخود).
مدیریت relation ها و کلیدها و ... با چند دیتاتیبل مجزا امکانپذیر نیست شما به یک دیتاست برای انجام اینکار نیاز دارید. در هر حال دیتاتیبل از دیتاست جدا نیست. گفتم دیتاست مانند یک دیتابیس مقیم در حافظه ست و دیتاتیبل جدولهای این دیتابیسه.
اگر شما در پروژه تون نیاز به ارتباط مابین جداول و مدیریت کلیدها و ... دارید باید از دیتاست استفاده کنید و اینکه سرعت دیتاتیبل بیشتره یا دیتا ست هیچ معنی نمیده چون دیتاست از خودش هیچ داده ای نداره بلکه داده ها در یک دیتاتیبل و در درون این دیتاست قرار میگیرن.
بهر حال استفاده از این دو جدا از هم نیست.

اینکه بگید از کدوم استفاده کنم درست نیست.
چون وقتی شما DataSet دارید حتما چند تا DataTable هم دارید که توی DataSet هستند.
در واقع اینجوریه که شما همیشه DataTable رو دارید وقتی که لازم باشه در کنارش از DataSet هم استفاده می کنید و اگه لازم نباشه نمی کنید.

استفاده از دیتاست فقط روش ویزاردی است؟؟؟
شما نیازمند یک دیتاست برای تعریف کردن روابط مابین جداول و حفظ یکپارچگی داده ها هستید. ضمنا دوستانی که از روشهای ویزاردی دوری مکنن باید بدونن که ترکیب روش های ویزاردی با روشهای کدنویسی دستی بهتر از یک روشه.
شما چند لایه برنامه بنویس چه ایرادی داره اگر یک متد داری که یکسری اطلاعات رو از دیتابیس استخراج میکنه و اونها فقط داده های یک جدول هستن خوب معلومه شما باید از دیتاتیبل استفاده کنی اما اگر قرار باشه رکوردی رو دارای کلید خارجی است بروز رسانی کنی خوب قاعدتا استفاده از دیتاست اصولی تر و درست تر از دیتا تیبل است که باید بصورت دستی این موارد رو کنترل کنی.
ضمنا به نظر من ایجاد یک دیتاست از دیتابیس و قرار دادن تمامی جداول در آن بصورت ویزاردی هیچ ایرادی نداره و شما میتونید یک کلاس برای لایه DAL داشته باشید و با پاس دادن همین جداول بروز رسانی کنید و این راه بسیار بهتر از اینه که شما بشینی تک تک فیلدها رو با ایندکس یا نام بایند کنی و یا بروز کنی.
ترکیب دیتاست مقیم در حافظه و کلاسی برای مدیریت آن بسیار اصولی ، کارآمد و در عین حال هزینه کمتری نسبت به بکار گیری روشهای متعصبانه و ... است.
اگر روش ویزاردی بد بود اصلا چرا ایجاد شد اگر بهترین روشه چرا بعضی ها نهی میکنن؟؟؟
این چیزی جز روش های خودون نیست اما من میگیم دو روش رو بکار بگیر و بجای بروز رسانی با Adaptor هایی که دیتاست میسازه شما لایه Dal رو خودت مدیریت کن.
شما انتظار نداشته باش من به شما بگم اگر شما یک دیتا گرید در فرمی دارید که 50 فیلد رو نشون میده لطف کن دستی مقدار دهی کن چون به هیچ عنوان قابل قبول نیست شما برای اینکار نیازمند یک دیتاست ویزاردی هستی و ضمنا برای بروز رسانی میتونی بجای adaptor های ویزاردی از کلاسهای خودت استفاده کنی. چند لایه بودن هم حفظ میشه.
 

در طراحی بانک اطلاعاتی ، شما برای موجودیتهاتون تعدادی جدول طراحی میکنید. این جداول بهتره که صرفا برای یه موجودیت طراحی بشن . مثلا موجودیت مشتری یه جدول و برای موجودیت کالا یه جدول دیگه

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

حال برمیگردیم به موضوع اصلی
در زمان طراحی ، شما میخواین فرمی رو طراحی کنین که اطلاعات مشتری ( مشخصات و کالاهای انتخابیش ) رو نشون بدید. مثلا در فرمتون دو DataGridView دارین که در اولی اطلاعات مشتری ها و در دومی اطلاعات کالا های انتخابی یه مشتری که در جدول بالایی سطرش انتخاب شده.
شما برای اینکار دو روش دارید.

1. روش اول . شما از استفاده میکنید و اطلاعات اون جداول رو (مشتری و کالا) به همراه ارتباط و کلید ها و ... به کلاستون Bind میکنید و از خاصیت های BindingContext و CurrencyManager و DataBinding و ... استفده میکنید .
. یعنی اطلاعات فیزیکی رو مثلا ازSQL خونده و در یه محیط مجازی به نام Dataset قرار میدید. و ارتباط با دیتابیس بسته میشه (تکنولوژی ADO.NET) و از اون اطلاعات استفاده میکنید.
2.روش دوم . شما هر زمان و در هر قسمتی که لازم باشه اطلاعات لازمه رو میخونید .
مثلا ابتدا جدول مشتری هاتون رو پر میکنید و بعد با انتخاب هر سطر از این جدول اطلاعات جدول دوم رو پر میکنید.
حال ما با این کار نداریم که کدوم از روش های بالا خوبه یا بده . این بسته به طراحیتون داره .
اگه شما میخواین جداول رو به صورت کلی با ارتباطشون و ...(مزایای DataSet) بخونید چاره ای جز استفاده از DataSet وندارین. ولی اگه میخواین مثلا یه کنتری مثل DataGridView یا Combobox رو پر کنید استفاده از DataTable خیلی بهتره و ساده تر و ... ه
در بیشتر پروژه هایی که در این سایت نوشته شده اعمالی مثل پرکردن DataGridView یا Combobox رو با DataSet نوشتن که به نظر من در این حالت DataTable بهتر بود.

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