02/10/2018, 00:02

[BÀI 1] Đơn giản hóa lập trình với cơ sở dữ liệu

Lập trình .NET với cơ sở dữ liệu chắc chắn là ai cũng sẽ trải qua nếu học lập trình vậy có khi nào bạn cảm thấy mệt mỏi và nhàm chán khi phải viết đi viết lại những câu: đóng, mở kết nối và thực thi stored để lấy dữ liệu hay không? Nếu bạn viết 1 bài đơn giản chỉ ...

Lập trình .NET với cơ sở dữ liệu chắc chắn là ai cũng sẽ trải qua nếu học lập trình vậy có khi nào bạn cảm thấy mệt mỏi và nhàm chán khi phải viết đi viết lại những câu: đóng, mở kết nối và thực thi stored để lấy dữ liệu hay không? Nếu bạn viết 1 bài đơn giản chỉ có chức năng lấy lấy dữ liệu và hiển thị lên GridView thì đó ko có gì đặc biệt nhưng nếu bạn viết 1 chương trình lớn với hàng trăm hoặc thậm chí cả ngàn lần như vậy thì mình tin chắc bạn sẽ suy nghĩ lại về cảu hỏi của mình. Và đó là lý do mình làm chuỗi bài viết này để nhằm chia sẽ với các bạn những gì mình đã làm để giải quyết vấn đề đó. 

Nhưng trước khi bắt đầu bài viết mình có một số vấn đề cần trao đổi với các bạn là nhóm của tụi mình làm những bài này ko phải để dạy mà để chia sẻ kinh nghiệm, những cái gì hay hoặc hướng giải quyết vấn đề trong lập trình mà bọn mình biết cho các bạn tham khảo. Nên những bài viết này có thể ko phải là các làm tốt nhất hoặc tối ưu nhất nhưng nó giải quyết được vấn đề và quan trọng hơn là truyền tải 1 cách dễ hiểu nhất đến với các bạn. Nên nếu các bạn nắm và hiểu được cách làm thì có thể phát triển những đoạn code hoàn chỉnh hoặc tối ưu hơn nhé.

Đây là bài đầu tiên và cơ bản nhất nên những bài sau của chuỗi bài hướng dẫn này mình sẽ ko lập lại nữa nên các bạn chú ý chút nhé:

Mình xin chia sẻ với các bạn 1 chút là trong khi lập trình thì những hàm nào mà các bạn thường hay sử dụng lặp đi lặp lại nhiều lần thì nếu có thể hãy đưa nó vào 1 class riêng để mình có thể gọi lại nhiều lần đề sử dụng mà ko cần phải viết lại. Trong chuỗi bài viết này mình sẽ thiết kế 1 class là clsProvider để chứa các hàm xử lý liên quan đến cơ sở dữ liệu. Nếu các bạn viết 1 chương trình lớn và có nhiều project thì có thể viết nó thành 1 thư viện (*.DLL) để Import vào mà sử dụng cũng được. Nói xong rồi giờ mình sẽ bắt đầu

Mình sẽ thiết kế 1 class như sau (Thông tin mình đã comment trong code các bạn có thể xem lại). Hôm nay mình hướng dẫn các bạn viết hàm tổng quát để thực thi 1 stored có hoặc không có tham số

class clsProvider
	{
		/// <summary>
		/// Biến lưu giữ kết nối đến db
		/// </summary>
		public static SqlConnection lcSqlCon;
		/// <summary>
		/// Hàm mở kết nối
		/// </summary>
		public static void OpenConnect()
		{
			try
			{
				string strCon = "Chuỗi kết nối";
				lcSqlCon = new SqlConnection(strCon);
				if (lcSqlCon.State == ConnectionState.Closed)
					lcSqlCon.Open();
			}
			catch (Exception ex)
			{
			}
		}
		/// <summary>
		/// Hàm đóng kết nối
		/// </summary>
		public static void CloseConnect()
		{
			lcSqlCon.Close();
		}
		/// <summary>
		/// Hàm thực thi stored đã được khai báo sẵn trên SQL và không trả về giá trị từ SQL
		/// </summary>
		/// <param name="cStoreName">Tên stored</param>
		/// <param name="cParaName">Danh sách tham số của Stored</param>
		/// <param name="cParaValue">Danh sách giá trị tương ứng với từng tham số</param>
		/// <returns></returns>
		public static bool ExecStoreProcedure(string cStoreName, string[] cParaName = null, object[] cParaValue = null)
		{
			try
			{
				//Nếu kết nối được mở một lần duy nhất khi chạy chương trình thì không cần đoạn Open & Close connect ở đây nữa
				//Mình nói thêm là có một số người có cách viết là chỉ mở kết nối 1 lần thôi chứ không phải mõi lần thực thư là phải mở và đóng kết nối
				//VÀ MÌNH LÀM THEO CÁCH CHỈ MỞ 1 LẦN NÊN TỰ HIỂU RẰNG TRONG HÀM NÀY KẾT NỐI VỚI DB ĐÃ ĐƯỢC MỞ ^^
				//OpenConnect();
				using (SqlCommand sqlcm = new SqlCommand(cStoreName, lcSqlCon) { CommandTimeout = 0, CommandType = CommandType.StoredProcedure })
				{
					if (cParaName != null)
					{
						for (int i = 0; i < cParaName.Length; i++)
						{
							//Thêm giá trị vào từng tham số tương ứng để thực thi
							SqlParameter sqlPR = new SqlParameter(cParaName[i], cParaValue[i]);
							sqlcm.Parameters.Add(sqlPR);
						}
					}
					sqlcm.ExecuteNonQuery();
				}
				//Nếu mở kết nối 1 lần duy nhất thì ko cần đoạn này
				//CloseConnect();
				return true;
			}
			catch (Exception ex)
			{
				return false;
			}
		}
	}


Sau khi đã viết xong rồi thì công việc còn lại là nếu còn phải thực thi 1 stored nào thì các bạn chỉ cần gọi lại hàm ExecStoreProcedure mà thôi. Ví dụ mình có button1 ở form khác cần thực thi thì mình code như sau: 

private void button1_Click(object sender, EventArgs e)
		{
			//Giá trị 1,2: Có kiểu dữ liệu như thế nào thì tùy thuộc vào @Tham số 1,2
			//VD: @Tham số 1,2: là int và varchar thì giá trị của nó sẽ là: new object[]{1,'abcd'}
			clsProvider.ExecStoreProcedure("Tên Stored", new string[] { "@Tham số 1", "@Tham số 2" }, new object[] {"Giá trị 1","Giá trị 2" });
			//Nếu không có tham số thì viết như sau
			clsProvider.ExecStoreProcedure("Tên Stored");
		}

Bài viết còn tiếp tục những phần sau. Mong nhận được sự đóng góp từ các bạn để mình hoàn chỉnh hơn chuỗi bài viết này.

Tags: crud databasethêm xóa sửa tìm kiếm datatable
0