اما بریم سراغ اینکه حالا چطور می شه با استفاده از 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()
در مورد خود procedurی نوشتم این توضیح رو بدم که چهار تا Parameter داره که اولیش رو ما مقدار دهی نمی کنیم بلکه مقدار ازش می خوانیم. مقدارش توسط functionی به نام Scope_Identity() پر خواهد شد. این function آْخرین کد Identity تولید شده رو برای ما بر می گرداند. یعنی همونی که الان Insert شده.

اما بریم سراغ کد نویسی 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;
تا اینجا رو توضیح بدم که شما در Constructor نام StoredProcedure مورد نظرتون رو مشخص کردین. البته می تونستین این کار رو از طریق Property که به نام CommandText وجود داره هم انجام بدین.

بعد اومیدیم چهار تا Parameter بهش اضافه کردیم که اولیش با بقیه یه مقداری فرق داشت اونم به این ترتیب که اولیش خروجی داره نه ورودی. این رو با استفاده از Direction مشخص کردیم. برای مقدار دهی ما بقی Parameter ها هم از Value استفاده کردیم.


cmd.ExecuteNonQuery();
int Id = (int)cmd.Parameters["Id"].Value;
حالا دستور رو اجرا کردیم. نکته ای که وجود داره اینه که هیچ تفاوتی بین اجرای دستورات از طریق کد مستقیم SQL و یا StoredProcedure نداره. پس تمامی مسائلی که توی پست قبلی گفتم صدق می کنه و من از ExecuteNonQuery استفاده کردم.
بعد هم برای گرفتن مقدار پارامتر از Value استفاده کردم. دقت کنین که این رو بعد از اجرا نوشتم. و هنوز Connection من بسته نشده است.
و در نهایت:

cnn.Close();
MessageBox.Show(string.Format("New Person Inserted with ID : {0}",Id));

این داستان همچنان ادامه دارد ....