- [DEVEXPRESS] Hướng dẫn bật tính năng Scroll Pixcel in Touch trên GridView
- [DEVEXPRESS] Hướng dẫn sử dụng TileBar viết ứng dụng duyệt hình ảnh Winform
- [DEVEXPRESS] Tô màu border TextEdit trên Winform
- [C#] Lấy dữ liệu từ Console Write hiển thị lên textbox Winform
- [C#] Hiển thị Progress bar trên Window Console
- [C#] Di chuyển control Runtime và lưu layout trên winform
- [SQLSERVER] Sử dụng hàm NULL IF
- [C#] Chia sẽ source code mã đi tuần bằng giao diện Winform
- [C#] Flash Window in Taskbar Winform
- Download và Giải nén tập tin File sử dụng Powershell
- [C#] Hướng dẫn cách lấy thông tin đăng nhập tài khoản và mật khẩu web browser trên windows
- [VB.NET] CRUD Thêm xóa sửa tìm kiếm Realtime FireBase
- [C#] Hiển thị thông báo Toast Message trong lập trình Winform
- [C#] Cấu hình định dạng ngày tháng, thời gian trên Windows cho ứng dụng Winform
- [C#] Rút gọn đường dẫn link url với TinyURL API
- [C#] Hướng dẫn cách bo tròn winform with Radius
- [C#] Chia sẽ class BackGroundOverlay Show Modal cho Winform
- [C#] Hướng dẫn Flip Image Winform
- [C#] Invoke là gì? cách sử dụng phương thức Invoke()
- [C#] Hướng dẫn chia sẽ file, folder từ ứng dụng sang Zalo Chat
[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ỉ 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
{
///
/// Biến lưu giữ kết nối đến db
///
public static SqlConnection lcSqlCon;
///
/// Hàm mở kết nối
///
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)
{
}
}
///
/// Hàm đóng kết nối
///
public static void CloseConnect()
{
lcSqlCon.Close();
}
///
/// Hàm thực thi stored đã được khai báo sẵn trên SQL và không trả về giá trị từ SQL
///
///Tên stored
///Danh sách tham số của Stored
///Danh sách giá trị tương ứng với từng tham số
///
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.