برگزیده های پرشین تولز

سوال در مورد ارتباط با بانک اطلاعاتی Sql

Ali_Nob

کاربر تازه وارد
تاریخ عضویت
25 آپریل 2004
نوشته‌ها
290
لایک‌ها
2
با سلام
جهت متصل شدن و کار با بانک اطلاعاتی sql روش های مختلفی من دیدم مثل استفاده از command های sql ، روش Dataset و سپس اعمال تغییرات Dataset با بانک اطلاعاتی.
اگه کسی لطف کنه و یک توضیح کاملی از مزایا و معایب و مقایسه روش ها بگه یا link بده که بسیار عالی و ممنون می شوم ولی سوال اصلی من اینه که اگه ما جهت کار با بانک اطلاعاتی یک Dataset بصورت متغیر در برنامه بسازیم در مقایسه با استفاده از شیئ Dataset که میشه به فرم اضافه کرد و بصورت مثلا DataSet1.xsd ظاهر میشه و یک فایل هم با همون نام تولید میشه چه تفاوتی و چه مقایسه با حالت تعریف متغیر Dataset داره؟
 

_H2_

کاربر تازه وارد
تاریخ عضویت
27 می 2007
نوشته‌ها
35
لایک‌ها
0
سلام
در یک تاپیک در سایتی این مطلب را توضیح داده ام ولی چون سایت مطالبش را برای غیر اعضا قفل کرده اگر لینکش را بگذارم زیاد بدردتان نمیخورد، مگر انکه بیایید و عضو شوید در نتیجه برایتان کپی میکنم تا اجباری در عضویت نداشته باشید. (البته از عضویتتان خوشحال میشویم ولی من خودم شخصاً از لینک توضیحی که مرا مجلبور به عضویت کند خوشم نمی آید و حتی اینرا به مدیر آن سایت هم گفتم.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
اشیای اصلی ADO.Net
Connection
محل بانک را شناسایی میکند و پل اصلی ارتباط با منبع اطلاعات محصوب میشود که تمام راههای ارتباط نرم افزار و موتور بانک اطلاعاتی از این مسیر صورت میگیرد.
شی فوق قبل از اجرای هر دستوری باید Open شود و حتماً باید در پایان کار Close یا Dispose شود.

Commnad
یک دستور واحد SQL را اجرا میکند یا دستور مستقیم یا یک SP داخلی بانک.

DataReader
چیزی شبیه RecordSet در ADO قدیم است که نتیجه یک جدول را به صورت ReadOnly و فقط روبه جلو ارائه میدهد که فوق العاده سریع است ولی در هر لحظه یک سطر را رکورد را دارید و امکان برگشت عقب هم و تغییر هم ندارید.
شی فوق از نتیجه اجرای یک دستور ExecuteReader برروی Command پدید می آید و حتماً باید در پایان کار Close یا Dispose شود.

DataTable
یک جدول واحد کامل اطلاعات است که در RAM است و میتوانید هر بلایی خواستید سرش دربیاورید!
یک کپی است و به هیچ جا وصل نیست و تغییر در آن بدون ذخیره آن در بانک هیچ تاثیری در بانک اصلی ندارد.

DataSet
مجموعه ای از چندین DataTable و رابطه (Relation) بین آنها است که در اصل میتواند یک بانک اطلاعاتی را به طور کامل در RAM شبیه سازی کند. (جداول و رابطه و قیدها و...)

TypedDataSet
همان DataSet است که با وراثت Property هایی با نام واقعی جداول و فیلدها به آن اضافه شده.
یعنی DataSet خالی و تازه نمونه سازی شده (New) هیچ ساختار و فرمتی ندارد و بی شکل است، مثل یک دیتابیس تازه ساخته شده و خالی ولی TypedDataSet خالی و تازه نمونه سازی شده (New) ساختار دارد و شامل جدول است و فیلدها را با نام و نوع دارد، مثل یک دیتابیس با جدول و فیلد ولی خالی.
مثلاً برای گرفتن یک مقدار Integer از سطر پنجم یک جدول در DataSet معمولی شاید یکی از دو کد زیر را بنویسید:

کد:
i = CInt(ds.Tables(0).Rows(5).Item(0))
i = CInt(ds.Tables("TableName").Rows(5).Item("FieldName"))

ولی در یک TypedDataSet با وجودی که به علت وراثت دو کد فوق هم کار میکنند ولی احتمالاً از کد زیر استفاده خواهید کرد.

کد:
i = ds.TableName(5).FieldName

فکر کنم همین تک مثال نشانگر جنبه مثبت یک TypedDataSet باشد.

DataAdapter
یک Commnad محتوی دستور SELECT میگیرد و به کمک DataReader داخلی اش و با اجرای دستور Fill سطر به سطر را از بانک اصلی میخواند و DataTable یا DataSet را از آن پر میکند. (چیزی مثل فرمان Open یا Load)
و
در طرف دیگر سه Command برای دستورات DELETE و INSERT و UPDATE میگیرد و با اجرای دستور Update سطر به سطر DataTable یا DataSet را که تغییر کرده باشد با کمک انها در بانک اصلی ذخیره میکند (چیزی مثل فرامین Update و Save)
در اصل این شی رابط اصلی RAM و دیتابیش اصلی است و میتواند داده ها را در جهت انتقال بین این دو در هر دو جهت راهبری کند.
نکته جالبی در مورد DataAdapter وجود دارد، در اول همین بحث گفتیم که Connection باید قبل از اجرای هر دستوری Open شود و در آخر کار حتماً Close شود، در این بین رفتار DataAdapter با Connection های متصل به Command هایش جالب است، DataAdapter بررسی میکند و اگر Connection بسته باشد آن را موقتاً برای کار خود باز میکند و در پایان کارش مجدداً آن را میبندد!
یعنی Connection قبل از اجرای عملیات با DataAdapter هر وضعیتی داشته باشد، فرقی نمیکند و در پایان عملیات DataAdapter همان وضعیت را مجدداً خواهد داشت!
اگر بسته بوده، باز میشود و دستورات اجرا شده و مجدداً بسته میشود.
اگر باز بوده، فقط دستورات اجرا میشود و در پایان باز باقی خواهد ماند.


یعنی میتوان یک روند معمول و ساده برای ویرایش محتویات جدول را چنین بیان کرد.
ساخت یک Connection
ساخت یک DataAdapter به همراه 4 Command اش.
پر کردن DataTable یا DataSet به کمک متد Fill از DataAdapter
نمایش DataTable یا DataSet در DataGridView و اجازه تغییر به کاربر.
در آخر هم Save کردن DataTable یا DataSet به کمک متد Update شی DataAdapter در بانک اصلی.


ولی در کل نباید فراموش شود که کلاً Save و Load یک DataTable یا DataSet کار بشدت پرهزینه ای است و باعث کندی برنامه میشود، در نتیجه برای کارهای کوچک مثل دستور SELECT COUNT یا اصلاً SELECT و INSERT و UPDATE و DELETE و یا اجرای یک SP تک و واحد باید سعی شود مستقیماً از شی Command استفاده شود و یا در صورت نیاز از خروجی DataReader هم استفاده شود.
سرعت فوق العاده DataReader را فراموش نباید کرد و باید بین زمان کدنویسی و سرعت اجرای برنامه و خوانایی برنامه تعادل ایجاد کرد، نه افراط و نه تفریط.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
بهرحال اگر خواستید این هم لینک منبع اصلی
 

Ali_Nob

کاربر تازه وارد
تاریخ عضویت
25 آپریل 2004
نوشته‌ها
290
لایک‌ها
2
بسیار ممنون از توضیحات کاملتون فقط من در خصوص دو روش تعریف Dataset در داخل برنامه و حالت دوم تعریف بصورت مثلا فایل DataSet1.xsd چند سوال داشتم :
1- آیا در حالت DataSet1.xsd ، TypedDataSet که اطلاعات بر روی فایل xml ایجاد می شود سرعت نسبت حالت تعریف متغیر Dataset در برنامه کمتر نمی شود ؟
2- آیا در حالت xsd امنیت برنامه مشکل دار نمی شود ؟ یعنی دسترسی به این فایل برای کاربر آیا میسر می باشد ؟
 

_H2_

کاربر تازه وارد
تاریخ عضویت
27 می 2007
نوشته‌ها
35
لایک‌ها
0
سلام
1) متاسفانه سرعت TypedDataSet کمی از DataSet کمتر است!
2) نه ! اصلاً ربطی به امنیت ندارد! فایل xsd شما که در پروژه نهایی کپی نمیشود!
در اصل فایل xsd نگه دارنده موقعیت ها و تنظیمات پنجره طراح است و اصل TypedDataSet که وراثتی از DataSet است و حاوی کد برنامه نویسی است در فایل design.cs.* یا design.vb.* قرار دارد.
یعنی ماژول طراح TypedDataSet با کمک نمایه طراحی اطلاعات را در xsd ذخیره میکند و کد لازم برای ساخت وراثتها و کلاسسهای جدید را به جای شما در فایلی که بیان شد تایپ میکند و بار تایپ چندین هزار خط کد را از دوش شا بر میدارد!
 
بالا