![]() |
|
|||||||
| ثبت نام | کتابخانه فایل ها | راهنما | لیست کاربران | کلوب های کاربران | همه قسمت ها ، به عنوان خوانده شده علامت گذاری شوند |
| دسترسی به داده ها (از طریق ADO.Net و LINQ و ...) مباحث مربوط به دسترسی به داده ها از طریق ADO.Net و زبان پرس و چوی یکپارچه (LINQ) |
![]() |
|
|
ابزار های تاپیک | طریقه نمایش |
|
|
#1 |
|
کاربر دائمی
![]() تاریخ عضویت: آذر 1386
محل زندگی: Tehran
پست: 165
تشکرها: 5
1,425 بار تشکر شده در 95 پست
|
روش استفاده از SQL Command
سلام بر همه.
مطالب این پست حتما به صورت پراکنده در جایجای این انجمن مطرح شده است. اما به هر حال به نظرم رسید شاید اگر این مطالب به صورت یکجا و کنار هم باشه به درد بخوره. ضمنا این مطالب توسط خودم قبلا در developercenter.ir نیز در اختیار عموم قرار گرفته بودند. همانطور که می دونین کلاس SqlCommand برای اجرای دستورات روی بانک اطلاعاتی شما ایجاد شده. شما می توانید از این کلاس object ساخته و دستورات خود رو روی بانک اجرا و نتیجه مورد نظر رو داشته باشین. برای اجرای هر دستور شما باید یک Connection باز داشته باشین. یعنی هر وقت که میخواهین از این کلاس و متد های Execute ی که داری استفاده کنین مطمئن باشین که Connection ی که دارین باز است. همچنین این کلاس برای اجرای دستورات شما به چهار متد مجهز می باشد. کد:
ExecuteNonQuery() ExecuteReader() ExecuteScaler() ExecuteXmlReader() ExecuteNonQuery با استفاده از این دستور شما می توانید بعد از اجرای دستور خود به تعداد رکورد هایی که در اثر اجرای دستور شما دچار تغییر شده اند یا اصطلاحا (RowAffected) پی ببرین. دستورات Insert, Update, Delete نمونه های استفاده از این دستور هستند مثال: کد:
SqlConnection cnn = new SqlConnection(ConnectionString);
SqlCommandcnn = new SqlCommand("Delete from tblPerson where id=1",cnn);
cnn.Open();
int rowAffected = cmd.ExecuteNonQuery();
ExecuteReader همون طور که از اسمش برمیاد این دستور برای خواندن اطلاعات به صورت ReadOnly و ForwardOnly مورد استفاده قرار میگیره. خروجی این دستور یک object از جنس کلاس SqlDataReader هست که اصولا برای این منظور ساخته شده. بسیار سریع و در مواقع خواندن کاملا پر کاربرد می باشد. کد:
SqlConnection cmd = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("Select * from tblPerson",cnn);
cnn.Open();
SqlDataReader reader = cmd.ExecuteReader();
List<Person> list = new List<Person>();
while(reader.Read())
{
Person p = new Person();
if(reader[0] != DbNull.Value)
p.Name = reader[0].ToString();
if(reader[1] != DbNull.Value)
p.Family = reader[1].ToString();
if(reader[2] != DbNull.Value)
p.Age = int.Parse(reader[2].ToString());
list.Add(p);
}
cnn.Close();
ExecuteScaler این دستور در مواقعی استفاده می شود که خروجی مورد نظر شما از دستورات یک مقدار واحد باشه. مثلا موقعی که می خواهیم تعداد رکورد ها رو بگیریم. البته در صورتیکه دستور اجرای شمابیشتر از یک مقدار بر گردونه فقط یک موردش در اختیار شما خواهد بود. اولین ستون از اولین سطر. کد:
SqlConnection cnn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("Select count(*) from tblPerson",cnn);
cnn.Open();
int Count = (int)cmd.ExecuteScaler();
// دلیل استفاده از Casting به این جهت است که خروجی متد شما object بر میگرداند.
cnn.Close();
در مواردی استفاده می شود که شما می خواهین اطللاتتون از بانک به صورت Xml ایجاد شود. مثلا کد:
SqlCommand command = new SqlCommand("SELECT * FROM dbo.Customers FOR XML AUTO, XMLDATA", SqlConn);
در پست بعدی بیشتر در مورد این کلاس صحبت خواهم کرد.
__________________
وب سايت شخصي مسعود طباطبايي: http://www.tabatabaei.info مقالات من در رابطه با شيرپوينت: Sharepoint Persian Calendar آموزش ASP .NET و سي شارپ : http://csharptuning.blogfa.com |
|
|
| 48 کاربر از Masoud_TB به خاطر این مطلب مفید تشکر کرده اند: | *unos*, A.S.Roma, ali.hojjati, amin009, aminghaderi, Amir.Ki, amirmk, Arash_janusV3, Arash_Niazmand, behrooz123, bsng110, Dirbaz, ehsan248, faramarz_fireboy, hassan_bht, hasti shirazy, Hco_Company, hojjatshariffam, Hossis, imani1983, liliyan87, Mainar, maktitil, merlin_vista, meykou, MJVMJV, mosy_mouse, m_s_fazel, Nemo, netsucker, Nima NT, pars.engineer, pashang, r0o0yaaa, razavi_university, saeed_hf52, sajjadlove, sedghi_7020@yahoo.com, shahab2025, sinpin, steager64, sunbeam, مرتضی تقدمی, vahid2009, wishmaster48, _majede, ایمان اختیاری, سعید حمیدیانفر |
|
|
#2 |
|
کاربر دائمی
![]() تاریخ عضویت: آذر 1386
محل زندگی: Tehran
پست: 165
تشکرها: 5
1,425 بار تشکر شده در 95 پست
|
اما بریم سراغ اینکه حالا چطور می شه با استفاده از SqlCommand به جای استفاده مستقیم از دستورات Sqlی از StoredProcedure ها استفاده کرد. اما قبلش بذارین کمی توضیح بدم که اصلا چرا؟
1. اینکه دستورات StoredProcedure در بانک اطلاعاتی SqlServer هستند و موقع ایجادشون Parse می شوند به این معنا که شما خیالتون از بابت Syntax راحته. 2. اینکه به جهت اینکه Stored Procedure ها در بانک اطلاعاتی Compile می شوند سرعت اجراشون بیشتره. 3. اینکه احتمال سوء استفاده از دستورات SqlServer یا اصطلاحا Sql Injection رو به حداقل می رسونن. در مورد سومی بعدا بیشتر توضیح می دم. فرض کنید که یک جدول داریم به نام tblPerson و داخلش 4 تا فیلد داریم. فیلد اول یا همون Id به صورت اتوماتیک (Identity)خواهد بود. برای اجرای Stored Procedure ها شما یه Procedure شبیه به این رو در نظر بگیرین. کد:
Create procedure spInserPerson ( @Id [bigint] =null output , @FirstName [nvarchar](100), @LastName [nvarchar](50), @Age [int] ) as Insert into tblPerson (FirstName,LastName,Age) Values (@FirstName,@LastName,@Age) Set @Id = Scope_Identity() اما بریم سراغ کد نویسی C# خوب ما باید اول مشخص کنیم که می خواهیم StoreProcedure استفاده کنیم که این کار رو با استفاده از CommandType انجام می دیم. دوم باید Parameter ها رو محیا و بعد از از اولیش مقدار بگیریم. کد:
SqlConnection cnn = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand("spInsertPerson",cnn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Id",SqlDbTypes.Int).Direction = ParameterDirection.Output;
cmd.Parameters.Add("FirstName",SqlDbType.NVarchar).Value = "Ali";
cmd.Parameters.Add("LastName",SqlDbType.NVarchar).Value = "Rezaei";
cmd.Parameters.Add("Age",SqlDbType.Int).Value = 10;
بعد اومیدیم چهار تا Parameter بهش اضافه کردیم که اولیش با بقیه یه مقداری فرق داشت اونم به این ترتیب که اولیش خروجی داره نه ورودی. این رو با استفاده از Direction مشخص کردیم. برای مقدار دهی ما بقی Parameter ها هم از Value استفاده کردیم. کد:
cmd.ExecuteNonQuery(); int Id = (int)cmd.Parameters["Id"].Value; بعد هم برای گرفتن مقدار پارامتر از Value استفاده کردم. دقت کنین که این رو بعد از اجرا نوشتم. و هنوز Connection من بسته نشده است. و در نهایت: کد:
cnn.Close();
MessageBox.Show(string.Format("New Person Inserted with ID : {0}",Id));
__________________
وب سايت شخصي مسعود طباطبايي: http://www.tabatabaei.info مقالات من در رابطه با شيرپوينت: Sharepoint Persian Calendar آموزش ASP .NET و سي شارپ : http://csharptuning.blogfa.com |
|
|
| 29 کاربر از Masoud_TB به خاطر این مطلب مفید تشکر کرده اند: | *unos*, A.S.Roma, ali.hojjati, amin009, aminghaderi, Amir.Ki, Arash_janusV3, Arash_Niazmand, bsng110, ehsan248, faramarz_fireboy, Hossis, liliyan87, maktitil, merlin_vista, m_s_fazel, Nemo, Nima NT, pashang, razavi_university, saeed_hf52, sajjadlove, sinpin, sunbeam, مرتضی تقدمی, مسلم نیکرو, vahid2009, wishmaster48, _majede |
|
|
#3 |
|
کاربر دائمی
![]() تاریخ عضویت: آذر 1386
محل زندگی: Tehran
پست: 165
تشکرها: 5
1,425 بار تشکر شده در 95 پست
|
فرض کنیم که یک StoreProcedure شبیه این داریم.
کد: Create Procedure spSelectTables as Select * from tblPerson Select * from tblEmp حالا من می خواهم که با استفاده از یک SqlDataReader تمامی رکورد های هر دو جدول رو بخوانم. کد: کد:
SqlConnection cnn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("spSelectTables",cnn);
cmd.CommandType = CommandType.StoredProcedure;
cnn.Open();
SqlDataReader reader = cmd.ExecuteReader();
do
{
while(reader.Read())
{
lstList.Items.Add(reader.GetString(0) + "\t" + reader.GetString(1));
}
}while(reader.NextResult());
cnn.Close();
__________________
وب سايت شخصي مسعود طباطبايي: http://www.tabatabaei.info مقالات من در رابطه با شيرپوينت: Sharepoint Persian Calendar آموزش ASP .NET و سي شارپ : http://csharptuning.blogfa.com |
|
|
| 27 کاربر از Masoud_TB به خاطر این مطلب مفید تشکر کرده اند: | *unos*, A.S.Roma, ali.hojjati, aminghaderi, Amir.Ki, amir1385, Arash_janusV3, Arash_Niazmand, bsng110, danial82, ehsan248, faramarz_fireboy, liliyan87, mahdi68, MahmoudiNik, mohammadi4net, m_s_fazel, Nemo, Nima NT, pashang, razavi_university, sajjadlove, sinpin, sunbeam, wishmaster48, _majede, دانش آموز |
|
|
#4 |
|
کاربر دائمی
![]() تاریخ عضویت: آذر 1386
محل زندگی: Tehran
پست: 165
تشکرها: 5
1,425 بار تشکر شده در 95 پست
|
خوب حالا یکم حرفه ای ترش کنیم.
شاید موقعی که دارین نرم افزار هاتون رو تست می کنین دیده باشین که موقعی که داره از Sql Server اطلاعات میاره اگه یکم تعداد رکورد ها زیاد باشه نرم افزارتون Freeze میشه و به نظر میرسه که قفل شده. البته دلیلش کاملا واضحه. مثلا موقعی که می خواهید یه Grid رو بوسیله یک DataSet که با SqlDataAdpater پر میشه نشون بدین این اتفاق رو باید دیده باشین. (تصویر 1) برای اینکه این اتفاق نیافته و توی اون مدت زمانی که طول میکشه تا نرم افزارتون اطلاعات رو از بانک بیاره کار معمولش رو هم ادامه بده باید از روش asynchronous programming استفاده کنین. به این معنی که درخواست آوردن رکورد ها رو توی یک Thread دیگه انجام بدیم. و به محض اینکه جواب اومد اونوقت نمایش بدیم. برای این موضوع در کلاس SqlCommnad به ازاء سه تا از متد های که در ابتدای این نوشتار توضیح دادیم یک متد متناظر با پیشوند Begin.... وجود داره و همین طور یک متد متناظر با پسوند End.... یعنی: کد: کد:
BeginExecuteNonQuery() BeginExecuteReader() BeginExecuteXmlReader() EndExecuteNonQuery() EndExecuteReader() EndExecuteXmlReader() خوب فرض کنین که شما یک فرم داریم که داخلش یک Grid داره . حالا من می خوام موقعی که Form_Load اتفاق میافته گرید من هم پر بشه و نمایش داده بشه. حالا اگه اینکار برای تعداد رکورد های زیادی انجام بشه اونوقت یکم زمان می بره. کاری که می خوام انجام بدم اینکه فرم من بالا بیاد و بعد داخل یک Thread دیگه پر کردن اطلاعات برای نمایش انجام بشه. هر وقت که کار پر کردن تمام شد اونوقت نشونشون بدم. نمونه کد رو به پیوست براتون میذارم. فقط چند تا نکته هست که باید توضیح بدم. وقتی شما دارین از BeginExecute استفاده می کنین باید دقت کنین که نتیجه رو در همان لحظه به شما نمی دهد. در عوض از طریق یک Delegate که یک متد بدون خروجی و با یک Parameter از نوع IAsyncResult شما باید EndExecute رو فراخوانی کنین و نتیجه رو از طریق EndExecute... بگیرین. (تصویر 2) نکته آخر داشت یادم می رفت اینکه حتما باید در ConnectionString تون امکان استفاده از Asyncronize method ها رو با اضافه کردن Asynchronous Processing=true فعال کنین. توی این مثال برای اینکه نشون بدم Async چیست یک کلید Add داریم که همزمان با اجرای SqlCommand مون میتونه به لیست اضافه کنه. و یک Label هم وضعیت Command رو نشون میده. و تا موقعی که دوباره Ready نشه امکان بستن فرم رو نداریم.
__________________
وب سايت شخصي مسعود طباطبايي: http://www.tabatabaei.info مقالات من در رابطه با شيرپوينت: Sharepoint Persian Calendar آموزش ASP .NET و سي شارپ : http://csharptuning.blogfa.com |
|
|
| 35 کاربر از Masoud_TB به خاطر این مطلب مفید تشکر کرده اند: | *unos*, A.S.Roma, a3mooneabi22, Alen, ali.hojjati, aligilani1986, aminghaderi, Amir.Ki, amir1385, Arash_janusV3, Arash_Niazmand, bsng110, corona, danial82, ehsan248, ehsan957, el_abdollahi, hasti shirazy, liliyan87, Mahdad999, mahdi68, mohsen_t1, mosy_mouse, m_s_fazel, Nemo, Nima NT, razavi_university, rozegar21, sajjadlove, sinpin, SMRAH1, sunbeam, vahid2009, wishmaster48, xxxxxxxxxx |
|
|
#5 |
|
کاربر دائمی
![]() تاریخ عضویت: آذر 1386
محل زندگی: Tehran
پست: 165
تشکرها: 5
1,425 بار تشکر شده در 95 پست
|
بحث بعدی در مورد SqlConnection مربوط به Transaction هاست. به این معنی که گاهی مواقع لازم است که یک سری کار ها رو پشت سره هم اجرا بشن و در صورتیکه یکی از کار ها درست انجام نشد مابقی هم به حالت اولیه برگردد. به عنوان مثال وقتی شما می خواهین یک فاکتور رو ثبت کنین باید تمامی قلم های فاکتور نیز ثبت شوند و در صورتیکه حتی یکی از آنها انجام نشد باید ما بقی نیز RollBack شوند.
در دات نت ما یک کلاس داریم به نام SqlTransaction. برای ایجاد یک SqlTransaction شما باید وقتی Connection خود را باز کردید. با استفاده از دستور BeginTransaction روی object connection خود یک SqlTransaction ایجاد کنین: کد: کد:
SqlConnection cnn = new SqlConnection(ConnectionString);
SqlTransaction trans = null;
try
{
cnn.Open();
trans = cnn.BeginTransaction();
SqlCommand cmd = new SqlCommand("spInsertFactor",cnn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Transaction = trans;
/// rest of command configuration such as parameters and ....
cmd.ExecuteNonQuery();
trans.Commit();
}
catch(Exception ex)
{
if(trans != null)
trans.RollBack();
}
__________________
وب سايت شخصي مسعود طباطبايي: http://www.tabatabaei.info مقالات من در رابطه با شيرپوينت: Sharepoint Persian Calendar آموزش ASP .NET و سي شارپ : http://csharptuning.blogfa.com |
|
|
| 45 کاربر از Masoud_TB به خاطر این مطلب مفید تشکر کرده اند: | *unos*, A.S.Roma, ali.hojjati, aminghaderi, Amir.Ki, amir1385, anahitanaragh, Arash_janusV3, Arash_Niazmand, bitasoft.ir, bsng110, corona, dada_mohsen, danial82, ehsan248, elijooje, el_abdollahi, hana2064, hassan_bht, hojjatshariffam, Hossis, liliyan87, m1366p1, Mahdad999, mahdi68, masoud.t123, mehr_80, merlin_vista, meykou, mohsen_Iran, m_s_fazel, Nemo, Nima NT, persian_bigboy, peymanjon, peymannaji, r.dizin, razavi_university, rozegar21, sajjadlove, sunbeam, top7news, vahid2009, wishmaster48, _majede |
|
|
#6 | |
|
کاربر تازه وارد
![]() تاریخ عضویت: تیر 1386
محل زندگی: مشهد
پست: 38
تشکرها: 13
10 بار تشکر شده در 5 پست
|
نقل قول: روش استفاده از SQL Command
نقل قول:
|
|
|
|
| 6 کاربر از pooshiran به خاطر این مطلب مفید تشکر کرده اند: |
![]() |
| بوک مارک کردن این تاپیک |
| کاربرانی که این تاپیک را مشاهده میکنند: 1 (0 کاربران و 1 مهمان) | |
| ابزار های تاپیک | |
| طریقه نمایش | |
|
|
تاپیک های مشابه
|
||||
| نام تاپیک | ایجاد کننده تاپیک | تالار | پاسخ | آخرین پست |
| ارائه کنترل پیشرفته Command Bar (رایگان) | Payam Moradi | برنامه نویسی در 6 VB | 13 | سه شنبه 17 شهریور 1388 14:19 عصر |
| طریقه استفده از at command در دلفی | kont_200 | ابزارهای گزارش سازی در دلفی | 2 | شنبه 05 خرداد 1386 07:25 صبح |
| قرار دادن عکس به کمک یک command | r_z1365 | پایگاه داده MS Access | 1 | شنبه 16 دی 1385 21:44 عصر |
| وارد کردن دستورات AT Command | FirstLine | برنامه نویسی در Delphi | 0 | دوشنبه 26 بهمن 1383 13:12 عصر |
| command های مربوط به صوت | infinity | برنامه نویسی در C# | 2 | پنج شنبه 24 دی 1383 12:44 عصر |