سلام بر همه.
مطالب این پست حتما به صورت پراکنده در جایجای این انجمن مطرح شده است. اما به هر حال به نظرم رسید شاید اگر این مطالب به صورت یکجا و کنار هم باشه به درد بخوره. ضمنا این مطالب توسط خودم قبلا در 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();
ExecuteXmlReader
در مواردی استفاده می شود که شما می خواهین اطللاتتون از بانک به صورت Xml ایجاد شود. مثلا

SqlCommand command = new SqlCommand("SELECT * FROM dbo.Customers FOR XML AUTO, XMLDATA", SqlConn);
این متد یک object از جنس XmlReader در اختیار شما قرار می دهد که می توانید ساختار Xml خروجی را بررسی و نمایش دهید.

در پست بعدی بیشتر در مورد این کلاس صحبت خواهم کرد.