PDA

View Full Version : چرایی و اهمیت وجود SelectCommand،InsertCommand و ... در SqlDataAdapter !



puvinax
جمعه 12 فروردین 1390, 00:17 صبح
با سلام خدمت دوستان
شاید سوال من عجیب به نظر برسد اما اجازه بدید مطرح کنم !
به کد زیر دقت کنید :


public static SqlDataAdapter CreateCustomerAdapter(
SqlConnection connection)
{
SqlDataAdapter adapter = new SqlDataAdapter();
// Create the SelectCommand.
SqlCommand command = new SqlCommand("SELECT * FROM Customers " +
"WHERE Country = @Country AND City = @City", connection);
// Add the parameters for the SelectCommand.
command.Parameters.Add("@Country", SqlDbType.NVarChar, 15);
command.Parameters.Add("@City", SqlDbType.NVarChar, 15);
adapter.SelectCommand = command;
// Create the InsertCommand.
command = new SqlCommand(
"INSERT INTO Customers (CustomerID, CompanyName) " +
"VALUES (@CustomerID, @CompanyName)", connection);
// Add the parameters for the InsertCommand.
command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
adapter.InsertCommand = command;
// Create the UpdateCommand.
command = new SqlCommand(
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
"WHERE CustomerID = @oldCustomerID", connection);
// Add the parameters for the UpdateCommand.
command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
SqlParameter parameter = command.Parameters.Add(
"@oldCustomerID", SqlDbType.NChar, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;
adapter.UpdateCommand = command;
// Create the DeleteCommand.
command = new SqlCommand(
"DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);
// Add the parameters for the DeleteCommand.
parameter = command.Parameters.Add(
"@CustomerID", SqlDbType.NChar, 5, "CustomerID");
parameter.SourceVersion = DataRowVersion.Original;
adapter.DeleteCommand = command;
return adapter;
}



در حقیقت سوال من به خطوط 11،19،30 و 38 مربوط میشود.
من با ADO.NET آشنا هستم اما سوالم در مورد چرایی وجود و فلسفه پشت دستورات SelectCommand-InsertCommand-UpdateCommand-DeleteCommand است.
چرا در کلاس SqlDataAdapter با اینکه ما SqlCommand رو مشخص میکنیم مثلا در همین خط 6 و 7 دستور SELECT بیان شده است اما باز هم نیاز به بیان دستور SelectCommand داریم؟ مگر نه این است که SELECT بودن، با دستور SQL بیان شده چرا این متد در کلاس SqlDataAdapterایجاد شده است ؟
آیا متد های SelectCommand-InsertCommand-UpdateCommand-DeleteCommand کار ویژه ای انجام میدهند که وجودشان واجب است چون که اینها دقیقا بیانگر همان عملی هستند که دستور SQL به طور واضح بیان میکند وجود اینها چه ضرورتی دارد ؟

ممنون میشم جامع توضیح دهید و البته اگر بشه مقاله ای هم در مورد چرایی وجودشان قرار دهید.
با آرزوی بهترین ها

shadi khanum
جمعه 12 فروردین 1390, 01:31 صبح
ببین adapter برای اینکه بتونه select,insert,delete,.. رو انجام بده باید بدونه که چه دستور sql رو اجرا کنه. اگه واسش دستورات Sql که باید انجام بده رو مشخص نکرده باشی چطور میتونه با دیتابیس کار کنه و چیزی که میخوای رو Select یا delete و... بکنه؟ شما تو خط 6و7 یه command تعریف کردی و یه commandtext بهش دادی (select * from customer....) ولی جایی این command رو به Adapter مربوط نکردی، که این ارتباط تو خط 11 انجام شده. adapter هروقت بخواد عملیات Fill رو انجام بده باید با دیتابیس ارتیاط برقرار کنه و واسه این کار نیاز به یه command داره که اون دستور Select مربوطه رو توش داشته باشه.واسه insert و delete و update هم دقیقا همینه...
البته اگه از شی commandbuilder استفاده کنی خودش واست این commandها رو میسازه و نیاز نیست خودت دستی واسش بنویسی

puvinax
جمعه 12 فروردین 1390, 02:10 صبح
ببین adapter برای اینکه بتونه select,insert,delete,.. رو انجام بده باید بدونه که چه دستور sql رو اجرا کنه. اگه واسش دستورات Sql که باید انجام بده رو مشخص نکرده باشی چطور میتونه با دیتابیس کار کنه و چیزی که میخوای رو Select یا delete و... بکنه؟ شما تو خط 6و7 یه command تعریف کردی و یه commandtext بهش دادی (select * from customer....) ولی جایی این command رو به Adapter مربوط نکردی، که این ارتباط تو خط 11 انجام شده. adapter هروقت بخواد عملیات Fill رو انجام بده باید با دیتابیس ارتیاط برقرار کنه و واسه این کار نیاز به یه command داره که اون دستور Select مربوطه رو توش داشته باشه.واسه insert و delete و update هم دقیقا همینه...
البته اگه از شی commandbuilder استفاده کنی خودش واست این commandها رو میسازه و نیاز نیست خودت دستی واسش بنویسی

ممنون از پاسختون یک جمله ی جالب بکار بردید

ولی جایی این command رو به Adapter مربوط نکردی، که این ارتباط تو خط 11 انجام شده.این جمله تقریبا پاسخ سوال من بود.
اینکه من پرسیدم چرا با توجه به دستور SQL که خودش نمایانگر عمل SELECT یا INSERT یا .... هستش چرا ما از SelectCommand یا InserCommand استفاده میکنیم مقایسه روش فوق با روش زیر بود !!! که برام شبه ایجاد کرد. (البته میدونم که این ها دو روش متفاوتند !)



// prepare command string
string insertString = @"
insert into Categories
(CategoryName, Description)
values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')";
// 1. Instantiate a new command with a query and connection
SqlCommand cmd = new SqlCommand(insertString, conn);
// 2. Call ExecuteNonQuery to send command
cmd.ExecuteNonQuery();




چون وقتی از ExecuteNonQuery استفاده می کنیم خودش مستقیما دستور SQL رو اجرایی میکنه (و مشخصا تشخیص میده !) اما من از این متعجب بودم که با اینکه برای هر دو روش، در SqlCommand دستور SQL ذکر میشود، اما چرا باید برای SqlDataAdapter نوع Command را مشخص کرد.

از پاسختون سپاس گذارم

amir-yeketaz
جمعه 12 فروردین 1390, 02:37 صبح
الان زمونه زمونه ی Linq to Sql و Entity framework هستش!!! ... زیاد نمیخواد اعصابتو برا این کلاس ها خورد کنی ... برو یه کدوم از اون دو تا (مخصوصا EF ) رو یاد بگیر که آینده با ایناست! هر چند که همشون تکنولوژی هایی هستن که باباشون ADO.Net هست!


موفق باشید ...

puvinax
جمعه 12 فروردین 1390, 09:50 صبح
الان زمونه زمونه ی Linq to Sql و Entity framework هستش!!! ... زیاد نمیخواد اعصابتو برا این کلاس ها خورد کنی ... برو یه کدوم از اون دو تا (مخصوصا EF ) رو یاد بگیر که آینده با ایناست! هر چند که همشون تکنولوژی هایی هستن که باباشون ADO.Net هست!


موفق باشید ...

بله میدونم آینده از آن EF هستش اما دلیل نمیشه که از هر چیزی ساده بگذرم چون ممکنه بی مصرف شده باشه !!! اگر الان با این موضوع در ارتباطم ترجیح میدم یک بار برای همیشه مطالعه کنم،درک کنم و خلاص !!! علاقه ای ندارم این بی خیالی ها در آینده نه چندان دور باعث بشه که مشکلاتی پیش بیاد. بالاخره اگر شما اینجا وسواس به خرج ندادی همین شیوه مطالعه سر سری آخر کار دستت میده !!! (خودمو میگم البته به کسی جسارت نشه)

ممنون از اشاراتی که داشتید با سپاس

shadi khanum
جمعه 12 فروردین 1390, 14:12 عصر
اینکه من پرسیدم چرا با توجه به دستور SQL که خودش نمایانگر عمل SELECT یا INSERT یا .... هستش چرا ما از SelectCommand یا InserCommand استفاده میکنیم مقایسه روش فوق با روش زیر بود !!! که برام شبه ایجاد کرد. (البته میدونم که این ها دو روش متفاوتند !)
1
2
3
4
5
6
7
8
9
10
11
12
// prepare command string
string insertString = @"
insert into Categories
(CategoryName, Description)
values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')";
// 1. Instantiate a new command with a query and connection
SqlCommand cmd = new SqlCommand(insertString, conn);
// 2. Call ExecuteNonQuery to send command
cmd.ExecuteNonQuery();

چون وقتی از ExecuteNonQuery استفاده می کنیم خودش مستقیما دستور SQL رو اجرایی میکنه (و مشخصا تشخیص میده !) اما من از این متعجب بودم که با اینکه برای هر دو روش، در SqlCommand دستور SQL ذکر میشود، اما چرا باید برای SqlDataAdapter نوع Command را مشخص کرد.

ببین واسه کارایی که قرار نیست چیزی برگردونه و فقط قرار کاری رو دیتابیس انجام بشه مثل insert یا update اینجوری میشه استفاده کرد، یعنی فقط یه command تعریف کنی و دستوری که قرار انجام بده رو بهش بدی و همون command رو Execurenonquery بکنی، و نیاز نیست adapter تعریف کنی و insertcommand و ,updatecommand , ... بنویسی.
ولی وقتی میخوای چیزی از دیتابیس بخونی (Select) و اونو تو Datatable یا Dataset بریزی، با فقط command نمیشه انجام داد و باید Adapter رو به عنوان واسط واسه این کار قرار بدی ، یعنی command تعریف کنی، دستور رو بهش بدی ، adapter تعریف کنی، commandای که قرار این Adapter باش کار کنه رو بهش معرفی کنی و با متد fill اون Adapter بره دستوری که تو Command نوشتی رو اجرا کنه و خروجی Select رو تو dataset یا datatable بریزه