Cách dùng Stored Procedure trong C# [ADO.NET]
Trong bài viết này chúng ta sẽ tìm hiểu về cách sử dụng Stored Procedure (còn được gọi là Proc) để thao tác với SQL Server trong C# ADO.NET. Đây là cách thường dùng trong các ứng dụng thực tế, vì nó an toàn và có độ bảo mật cao.
Mình sẽ giới thiệu sơ lược về Proc là gì? cách gọi Proc trong C# ADO.NET và một số ví dụ cụ thể sử dụng nó.
1. Stored Procedure trong SQL là gì?
Stored Procedure trong SQL là một đối tượng cơ sở dữ liệu có chứa các câu lệnh SQL được biên dịch trước. Nói một cách dễ hiểu, Proc là một khối lệnh được thiết kế trước để thực hiện một tác vụ nào đó khi được gọi. Để hiểu rõ hơn, các bạn có thể xem bài viết chi tiết hơn về Stored Procedure trong SQL Server.
Ví dụ: Khi chúng ta muốn lấy một bảng dữ liệu trong SQL Server, nếu viết theo cách thông thường sẽ như sau:
Bài viết này được đăng tại [free tuts .net]
select * from Student
Giả sử chúng ta có một Proc "Select_Student" được viết với chức năng tương tự như trên.
create proc Select_Student as select * from Student
Thì khi cần sử dụng nó ta chỉ cần gọi tên, không cần phải viết một lệnh dài như vậy nữa.
Select_Student
Ở trên đây là một ví dụ đơn giản, nên các dòng lệnh không nhiều. Nếu có một tác vụ hàng chục dòng lệnh thì việc tạo Proc là rất tiện.
2. Cách gọi một Stored Procedure bằng C# ADO.NET
Trong phần này mình sẽ giới thiệu hai cách để gọi một Proc bằng C#, đây là hai cách thường được sử dụng.
Cách 1:
SqlCommand cmd = new SqlCommand(); cmd.Connection = connection; cmd.CommandText = "Select_Student"; cmd.CommandType = CommandType.StoredProcedure;
Đầu tiên ta cần tạo một instance thuộc class SqlCommand có tên là cmd, sau đó gán chuỗi kết nối vào cho thuộc tính Connection.
Chỉ định giá trị thuộc tính CommandText là tên của Stored Procedure và quan trọng nhất là chỉ định CommandType là loại lệnh StoredProcedure.
Cách 2:
SqlCommand cmd = new SqlCommand("Select_Student", connection) { CommandType = CommandType.StoredProcedure };
Trong cách này, về các thành phần thì không có gì khác so với cách 1. Ở đây, sử dụng phương thức khởi tạo được nạp chồng. Nghĩa là tên Proc và chuỗi kết nối được truyền thẳng vào đối tượng SqlCommand mà không thông qua thuộc tính Connection và CommandText.
Gọi một Stored Procedure với tham số đầu vào trong C#
Giả sử mình có một Proc trong SQL Server như sau.
Create Proc spGetStudent @Id int as begin select * from Student where Id = @Id end go
Trong Proc này ta thấy có một tham số truyền vào là @Id có kiểu dữ liệu là int. Và Proc này được sử dụng để lấy thông tin của học sinh có Id bằng với @Id truyền vào.
Với một Proc như vậy, thì khi gọi ở C# ta sẽ thực hiện gọi như sau.
//tạo đối tượng command SqlCommand cmd = new SqlCommand() { CommandText = "spGetStudent", Connection = connection, CommandType = CommandType.StoredProcedure }; //khai báo các thuộc tính của tham số SqlParameter param = new SqlParameter { ParameterName = "@Id", SqlDbType = SqlDbType.Int, Value = 101, Direction = ParameterDirection.Input }; //thêm tham số vào đối tượng SqlCommand cmd.Parameters.Add(param);
3. Ví dụ sử dụng Store Procedure trong C# ADO.NET
Trong ví dụ này mình sẽ thực hiện thêm, sửa, xóa dữ liệu trong SQL Server sử dụng Proc. Đây là những thao tác rất cơ bản những được sử dụng rất nhiều trong các ứng dụng.
Thêm dữ liệu vào SQL Server sử dụng Stored Procedure
Đầu tiên các bạn cần viết Proc để thêm dữ liệu vào SQL, cụ thể ở đây chúng ta sẽ viết thủ tục spInsertStudent để thêm học sinh vào bảng StudentDb.
create proc spInsertStudent @Id int, @Name nvarchar(50), @Email nvarchar(50), @Mobile int as begin insert Student(Id,Name,Email,Mobile) values(@Id,@Name,@Email,@Mobile) end go
Sau khi đã tạo xong Proc, bây giờ chúng ta sẽ gọi nó trong C# để chạy Proc và thêm dữ liệu vào
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Program { static void Main(string[] args) { //gọi hàm insert để thêm học sinh new Program().insert(); Console.ReadKey(); } public void insert() { //sử dụng lớp SqlConnection để tạo chuỗi kết nối SqlConnection con = new SqlConnection(); //gọi chuỗi kết nối ở file App.config bằng thuộc tính ConnectionString con.ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString; try { //khỏi tạo instance của class SqlCommand SqlCommand cmd = new SqlCommand(); //sử dụng thuộc tính CommandText để chỉ định tên Proc cmd.CommandText = "spInsertStudent"; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = con; //khai báo các thông tin của tham số truyền vào cmd.Parameters.Add("@Id", SqlDbType.Int).Value = 105; cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = "Tin"; cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = "tin@gmail.com"; cmd.Parameters.Add("@Mobile", SqlDbType.NVarChar).Value = "1234123148"; //mở chuỗi kết nối con.Open(); //sử dụng ExecuteNonQuery để thực thi cmd.ExecuteNonQuery(); //đóng chuỗi kết nối. con.Close(); Console.WriteLine("Them hoc sinh thanh cong !!!"); } catch (Exception e) { Console.WriteLine("Co loi xay ra !!!" + e); } // dóng chuỗi kết nối finally { con.Close(); } } } }
Kết quả:
Sửa dữ liệu trong SQL Server sử dụng Stored Procedure
Tượng tự như thêm mới dữ liệu, ta cũng sẽ viết Proc để sửa dữ liệu. Sau đó gọi nó trong C# để thực hiện sửa thông tin, cụ thể là sửa thông tin học sinh trong bảng Student của database StudentDb.
createproc spUpdateStudent @Id int, @Name nvarchar(50), @Email nvarchar(50), @Mobile nvarchar(20) as begin update Student set Name = @Name, Email = @Email, Mobile = @Mobile where Id = @Id end go
Sau khi tạo Proc xong thì ta tiến hành gọi nó trong C# với cấu trúc tương tự như thêm mới dữ liệu.
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Program { static void Main(string[] args) { //gọi hàm update để sửa học sinh new Program().update(); Console.ReadKey(); } public void update() { //sử dụng lớp SqlConnection để tạo chuỗi kết nối SqlConnection con = new SqlConnection(); //gọi chuỗi kết nối ở file App.config bằng thuộc tính ConnectionString con.ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString; try { //khỏi tạo instance của class SqlCommand SqlCommand cmd = new SqlCommand(); //sử dụng thuộc tính CommandText để chỉ định tên Proc cmd.CommandText = "spUpdateStudent"; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = con; //khai báo các thông tin của tham số truyền vào cmd.Parameters.Add("@Id", SqlDbType.Int).Value = 105; cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = "Linh"; cmd.Parameters.Add("@Email", SqlDbType.NVarChar).Value = "linh@gmail.com"; cmd.Parameters.Add("@Mobile", SqlDbType.NVarChar).Value = "9999999999"; //mở chuỗi kết nối con.Open(); //sử dụng ExecuteNonQuery để thực thi cmd.ExecuteNonQuery(); //đóng chuỗi kết nối. con.Close(); Console.WriteLine("Sua hoc sinh thanh cong !!!"); } catch (Exception e) { Console.WriteLine("Co loi xay ra !!!" + e); } // dóng chuỗi kết nối finally { con.Close(); } } } }
Kết quả:
Xóa dữ liệu khỏi SQL Server sử dụng Stored Procedure
Proc xóa dữ liệu khỏi SQL Server, cụ thể là bảng Student của database StudentDb.
create proc spDeleteStudent @Id int as begin delete Student where Id = @Id end go
Gọi Proc spDeleteStudent trong C# và thực hiện xóa học sinh khỏi bảng Student.
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp { class Program { static void Main(string[] args) { //gọi hàm delete để xoa học sinh new Program().delete(); Console.ReadKey(); } public void delete() { //sử dụng lớp SqlConnection để tạo chuỗi kết nối SqlConnection con = new SqlConnection(); //gọi chuỗi kết nối ở file App.config bằng thuộc tính ConnectionString con.ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString; try { //khỏi tạo instance của class SqlCommand SqlCommand cmd = new SqlCommand(); //sử dụng thuộc tính CommandText để chỉ định tên Proc cmd.CommandText = "spDeleteStudent"; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = con; //khai báo các thông tin của tham số truyền vào cmd.Parameters.Add("@Id", SqlDbType.Int).Value = 105; //mở chuỗi kết nối con.Open(); //sử dụng ExecuteNonQuery để thực thi cmd.ExecuteNonQuery(); //đóng chuỗi kết nối. con.Close(); Console.WriteLine("Xoa hoc sinh thanh cong !!!"); } catch (Exception e) { Console.WriteLine("Co loi xay ra !!!" + e); } // dóng chuỗi kết nối finally { con.Close(); } } } }
Kết quả:
Như vậy là chúng ta đã tìm hiểu về cách sử dụng Stored Procedure để thao tác với SQL Server trong C# ADO.NET. Các bạn hãy luyện tập thật nhiều để thành thạo nó nhé, chúc các bạn thành công !!!