عملیات انتخاب، درج، حذف و ویرایش
در این درس شما را با نحوه ی کد نویسی در لایه ها آشنا می کنم . همانطور که در درس های قبلی خواندیم ، بانک اطلاعاتی برنامه متشکل از یک جدول با 3 فیلد می باشد . حال قصد داریم 4 عمل اصلی را برای این جدول پیاده سازی کنیم . ابتدا برای راحتی کار و ساده تر شدن نگهداری و تغییر برنامه باید رشته اتصال به بانک اطلاعاتی را در یک مکان تعریف کنیم تا اگر نیاز به تغییر آن داشتید فقط یک مکان را تغییر دهید . برای این کار باید رشته اتصال را در فایل App.config برنامه قرار دهید ، به شکل زیر این کار را انجام می دهیم :
بر روی فایل ایجاد شده دوبار کلیک کرده و کد های آن را به شکل زیر تغییر دهید :
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="DatabaseConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB; AttachDbFilename=|DataDirectory|\PhoneBookDatabase.mdf; Integrated Security=True;Connect Timeout=30"/> </connectionStrings> </configuration>
حال چونکه که می خواهیم از این رشته اتصال در قسمت DataAccessLayer استفاده کنیم ، باید اسمبلی System.Configuration را به این قسمت اضافه کنیم . برای این کار به مراحل زیر توجه کنید :
و در نهایت فضای نام System.Configuration را به کلاس tablePerson موجود در لایه DataAccessLayer اضافه کنید .
برای نوشتن کد های دسترسی به بانک و 4 عمل اصلی باید کد ها را در لایه ی Data Access بنویسیم .
انتخاب اطلاعات
ابتدا بر روی فایل tablePerson.cs در لایه ی DataAccessLayer دوبار کلیک کنید Connection را به صورت زیر تعریف کنید :
using System; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace DataAccessLayer { public class tablePerson { private SqlConnection databaseConnection = new SqlConnection(); public tablePerson() { this.databaseConnection.ConnectionString = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString; } } }
در کد بالا نام رشته اتصالی را که قبلا در فایل App.Config تعریف کرده بودیم را در خاصیت ConnectionStrings کلاس ConfigurationManager و سپس خروجی آنرا در خاصیت ConnectionString فیلد databaseConnection قرار داده ایم.
برای نوشتن عمل واکشی اطلاعات ، بر روی فایل tablePerson.cs در لایه ی DataAccessLayer دوبار کلیک کرده و کد زیر را در کلاس tablePerson قرار دهید :
public DataTable Select() { string selectQuery = "SELECT * FROM tablePerson;"; SqlDataAdapter SqlDataAdapter1 = new SqlDataAdapter(selectQuery, this.databaseConnection); DataTable DataTable1 = new DataTable(); SqlDataAdapter1.Fill(DataTable1); SqlDataAdapter1.SelectCommand.Connection.Close(); return DataTable1; }
کد بالا عمل واکشی اطلاعات را به صورت یک متد در لایه ی DataAccessLayer تعریف می کند . حال باید یک متد نظیر را در لایه ی BusinessLoginLayer برای آن تعریف کنیم . بر روی فایل tablePerson.cs لایه ی Business Logic دوبار کلیک کرده و کد زیر را بنویسید :
public DataTable Select() { DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson(); return DALTablePerson1.Select(); }
کد بالا یک شی از کلاس tablePerson موجود در لایه ی Data Access ساخته و متد Select آن را فراخوانی می کند . در مرحله آخر باید اطلاعات را در فرم نمایش دهیم . بر روی فرم دوبار کلیک کرده و کد زیر را در رویداد Load آن بنویسید :
BusinessLogicLayer.tablePerson BLLTablePersonels1 = new BusinessLogicLayer.tablePerson(); this.dataGridView1.DataSource = BLLTablePersonels1.Select();
برنامه را اجرا کنید و نتیجه را مشاهده کنید.
ثبت اطلاعات
نمای کلی عملیات ثبت به شکل زیر می باشد :
ابتدا یک متد در لایه DataAccessLayer برای عمل درج اطلاعات می نویسیم ، بر روی فایل tablePerson در این لایه دوبار کلیک کرده و یک متد به شکل زیر به این کلاس اضافه کنید :
public void Insert(DataEntityLayer.tablePerson newPerson) { string insertQuery = "Insert Into tablePerson(Name,Family) VALUES(@Name, @Family);"; try { SqlCommand insertCommand = new SqlCommand(insertQuery, this.databaseConnection); insertCommand.Parameters.AddWithValue("@Name", newPerson.Name); insertCommand.Parameters.AddWithValue("@Family", newPerson.Family); this.databaseConnection.Open(); int result = insertCommand.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { this.databaseConnection.Close(); } }
همانطور که در خط 8 مشاهده می کنید از آنجاییکه DataEntityLayer.tablePerson معادل یک رکورد از بانک اطلاعاتی می باشد ، مقادیر پارامتر ها را از خصوصیات این شی میگیریم و در بانک ثبت می کنیم .حال به مانند متد Select یک متد معادل در لایه BusinessLogicLayer برای متد Insert اضافه می کنیم . بر روی فایل tablePerson در لایه BusinessLogicLayer دوبار کلیک کرده و متدی به شکل زیر به این کلاس اضافه کنید :
public void Insert(DataEntityLayer.tablePerson newPerson) { if (!string.IsNullOrEmpty(newPerson.Name) && !string.IsNullOrEmpty(newPerson.Family)) { try { DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson(); DALTablePerson1.Insert(newPerson); } catch (Exception) { throw new Exception("Error in inserting into the database, Please try again"); } } else { throw new Exception("Please Enter Name And Family ..."); } }
در متد بالا اعتبارسنجی مقادیری که در خصوصیات Name و Family وجود دارد را با استفاده از متد IsNullOrEmpty کلاس string انجام می دهیم.اگر کاربر مقادیر را وارد کرده باشد عمل اصلی را بر روی بانک اطلاعاتی انجام می دهیم . حال بر روی دکمه ی درج در فرم برنامه دوبار کلیک کرده و کد زیر را می نویسیم :
DataEntityLayer.tablePerson tablePerson1 = new DataEntityLayer.tablePerson(txtName.Text, txtFamily.Text); BusinessLogicLayer.tablePerson BLLTablePerson1 = new BusinessLogicLayer.tablePerson(); try { BLLTablePerson1.Insert(tablePerson1); MessageBox.Show("New person has been successfully inserted into database"); this.dataGridView1.DataSource = BLLTablePerson1.Select(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
در خط 2 یک شی از کلاس tablePerson که در لایه ی DataEntityLayer قرار دارد ایجاد می کنیم . داده هایی که از فرم می گیریم(نام و نام خانوادگی) نظیر به نظیر در خصوصیات این شی قرار می دهیم . سپس این شی را برای عملیات اعتبار سنجی به لایه ی Business Logic تحویل می دهیم .
حذف اطلاعات
برای نوشتن متد حذف ابتدا بر روی فایل tablePerson در لایه DataAccess دوبار کلیک کرده و سپس متد زیر را به این کلاس اضافه کنید :
public void Delete(int index) { string deleteQuery = "DELETE FROM tablePerson Where Id = @Id;"; try { SqlCommand SqlCommand1 = new SqlCommand(deleteQuery, this.databaseConnection); SqlCommand1.Parameters.AddWithValue("@Id", index); SqlCommand1.Connection.Open(); int result = SqlCommand1.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { this.databaseConnection.Close(); } }
در مرحله دوم متد زیر را به کلاس tablePerson در لایه BussinessLogicLayer اضافه کنید :
public void Delete(int index) { if (index > 0) { try { DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson(); DALTablePerson1.Delete(index); } catch (Exception) { throw new Exception("Error in deleting record...Please try again"); } } else { throw new Exception("Please enter person id"); } }
در نهایت بر روی دکمه ی حذف بر روی فرم دوبار کلیک کرده و کد زیر را در رویداد کلیک آن بنویسید :
if (this.dataGridView1.Rows.Count > 0) { if (MessageBox.Show("Are you sure , you want to delete this record?", "Warning", MessageBoxButtons.YesNo) == DialogResult.Yes) { int personelRowIndex = Convert.ToInt32(this.dataGridView1.CurrentRow.Cells[0].Value.ToString()); BusinessLogicLayer.tablePerson BLLTablePerson1 = new BusinessLogicLayer.tablePerson(); try { BLLTablePerson1.Delete(personelRowIndex); this.dataGridView1.DataSource = BLLTablePerson1.Select(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
در کد بالا ابتدا بررسی می کنیم که آیا رکوردی برای حذف وجود دارد یا نه . در صورتی درستی این مطلب شماره آن رکورد را گرفته و برای حذف به لایه BusinessLogicLayer ارسال می کنیم .
ویرایش اطلاعات
ابتدا متد زیر را به کلاس tablePerson در لایه DataAccessLayer اضافه می کنیم :
public void Update(DataEntityLayer.tablePerson personToUpdate) { string updateQuery = "UPDATE tablePerson SET Name=@Name,Family=@Family WHERE Id=@Id;"; try { SqlCommand updateCommand = new SqlCommand(updateQuery, this.databaseConnection); updateCommand.Parameters.AddWithValue("@Name", personToUpdate.Name); updateCommand.Parameters.AddWithValue("@Family", personToUpdate.Family); updateCommand.Parameters.AddWithValue("@Id", personToUpdate.Id); updateCommand.Connection.Open(); updateCommand.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { this.databaseConnection.Close(); } }
سپس متد معادل را برای اعتبارسنجی مقادیر به لایه منطقی(BusinessLogicLayer) اضافه می کنیم :
public void Update(DataEntityLayer.tablePerson personToUpdate) { if (personToUpdate.Id > 0 && !string.IsNullOrEmpty(personToUpdate.Name) && !string.IsNullOrEmpty(personToUpdate.Family)) { try { DataAccessLayer.tablePerson DALTablePerson1 = new DataAccessLayer.tablePerson(); DALTablePerson1.Update(personToUpdate); } catch (Exception) { throw new Exception("Error in updating information , Please try again"); } } else { throw new Exception("Please enter all information"); } }
و در نهایت بر رور دکمه ی ویرایش بر روی فرم دوبار کلیک کرده و کد زیر را در رویداد کلیک آن بنویسید :
if (this.dataGridView1.Rows.Count > 0) { if (this.btnUpdate.Text == "Update") { string Name = this.dataGridView1.CurrentRow.Cells[1].Value.ToString(); string Family = this.dataGridView1.CurrentRow.Cells[2].Value.ToString(); this.txtName.Text = Name; this.txtFamily.Text = Family; this.btnUpdate.Text = "Submit Update"; this.btnInsert.Enabled = false; this.btnDelete.Enabled = false; } else { try { int personIndex = Convert.ToInt32(this.dataGridView1.CurrentRow.Cells[0].Value.ToString()); DataEntityLayer.tablePerson personToUpdate = new DataEntityLayer.tablePerson(personIndex, txtName.Text.Trim(), txtFamily.Text.Trim()); BusinessLogicLayer.tablePerson BLLTablePerson1 = new BusinessLogicLayer.tablePerson(); BLLTablePerson1.Update(personToUpdate); this.dataGridView1.DataSource = BLLTablePerson1.Select(); MessageBox.Show("Record updated successfully"); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { this.btnUpdate.Text = "Update"; this.btnInsert.Enabled = true; this.btnDelete.Enabled = true; this.txtName.Text = string.Empty; this.txtFamily.Text = string.Empty; } } }
این دکمه باید یک وضعیت 2 حالتی داشته باشد . اگر متد روی این دکمه “Update” باشد باید داده ها را از Datagridview به جعبه های متن انتقال دهیم و متن روی آن را به “Submit Update” تغییر دهیم . اگر متن روی آن “Submit Update” باشد باید عملیات ویرایش را انجام دهیم. روند عمل ویرایش نیز مانند ثبت و حذف می باشد . یعنی یک شی از کلاس tablePerson لایه ی DataEntityLayer می سازیم و بعد از اعتبار سنجی آن به وسیله ی لایه ی Business Logic آن را برای عملیات نهایی به لایه ی Data Access تحویل می دهیم .
آقا یکی کمکمون کنه خیلی گیرم@
ببینید من با معماری که شما توضیح دادید کدام رو نوشتم حالا موقع ویرایش نمیخوام از طریق تکس باکس ها ویرایش انجام بشه و میخوام از طریق خود دیتاگرید ویو باشه من قبلا تو کد نویسی معمولی یه کامندبیلدر میذاشتم و بعد دیتااداپتر بش میدادم و بعدم به دیتا اداپتر دیتا تیبل رو میدادم راحت اپدیت با همون دیتاگرید ویو انجام میشد !
حالا موندم توش واقعا!نمیدونم چجوری به همون سادگی قبل این کارا بکنم.درضمن با گرفتن مقدار سلول ها و ریختنشون تو یه متغیر و بعدم ریختن متغیرها تو تکس و فرستادنشون به کوئری که شما برا ویرایش توضیح دادید عمل ویرایش انجام
وقا هر کی بلده کمک کنه گیرم
سلام ، آقای vbnetgenius از شما خواستن کدتون رو بذارید
http://www.w3-farsi.com/forum/index.php/2634/%D9%86%D8%AD%D9%88%D9%87-%D8%A2%D9%BE%D8%AF%DB%8C%D8%AA-%D8%A8%D8%A7-%D8%B4%D8%B1%D8%B7-%D9%81%DB%8C%D9%84%D8%AF-%D8%A7%D8%AA%D9%88-%D9%86%D8%A7%D9%85%D8%A8%D8%B1
الان مشکلمو حل کردم ولی یه مشکل بزرگی برام پیش اومده و اونم اینه که وقتی آپدیت رو میزنم پیغام موفقیت آمیز بودن میده ولی مقادیر ویرایش شده ای که فرستادم برا کلاس آپدیت رو ثبت نمیکنه حتی اومدم مقدار فیلدای دیتا گرید رو خوندم و گذاشتم تو تکس باکس بعد تکس باکس ها رو فرستادم ولی فایده نکرد !!!!!!
آقای ابراهیمی نظری نداشتید؟
اینو من نوشتم حالا یه مسئله ی خاص برام به وجود اومده
من یه فیلدی داخل دیتابیس دارم که اتو نامبر هستش و حالا که میخوام آپدیت کنم و شرط روش بزارم تو لایه ی دیتا انتیتی تعریفش نکردم حالا به نظرتون چیکار کنم؟
ببینید من میخوام کاربر وقتی ویرایش رو زد ویرایش دیتا گرید که قبلا غیر فعال بوده فعال بشه و وقتی ام ویرایش شد تو دیتابیس ثبت بشه
با سلام
من میخوام در قسمت ویرایش اطلاعات زمانی که کاربر روی یه سطر از دیتاگرید کلیک میکنه همون سطر قابلیت ویرایش پیدا کنه و نیاز به تکس برا نمایش و ویرایش نباشه..امکانپذیر هست؟
سلام، منظورتون اینه که تکس باکسی وجود نداشته باشه و سلول ها قابل ویرایش باشن؟
بله دقیقا منظورم همین هست.میخوام زمانی که کاربر دیتاگرید رو میبینه با زدن دکمه ویرایش خود دیتاگرید ویو حالت enable edit بشه و بعد هم بشه مقادیرشو فرستاد به دیتا انتیتی لایر و بعد هم مقادیر جدید ذخیره بشن
شرمنده من الان سیستم دم دستم نیست و دارم از طریق تبلت جوابتونو میدم، به این لینک یه نگاه بندازین ، اگه کارتون راه نیفتاد سعی می کنم تا شب جوابتونو بدم
http://www.w3-farsi.com/forum/index.php/1296/%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%85%D8%B3%D8%AA%D9%82%DB%8C%D9%85-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB%8C%D8%AF-%D9%88%DB%8C%D9%88-%D8%A8%D9%87-%D8%A8%D8%A7%D9%86%DA%A9
با سلام
ممنون از مطالب بسیار عالی و دقیقتون خیلی کمک کرد فقط در یک قسمت دچار مشکل شدم در قسمت Business Logic قسمت Update خطای سر ریزی stack میده
ممنون میشم راهنمایی کنید.
این هم متن خطای برنامه :