Một stored procedure là một hàm/ thủ tục được định nghĩa trước và có thể tái sử dụng trong một database (tương ứng với các query trong MS Access). SQL Server biên dịch các stored procedure giúp cho chúng làm việc hiệu quả hơn. Do đó, thay vì tạo các truy vấn động trong mã nguồn của bạn, bạn có thể được lợi ích về việc tái sử dụng và hiệu suất khi sử dụng stored procedure.. Phần sau sẽ cho bạn thấy cách để thay đổi đối tượng SqlCommand để sử dụng stored procedure. Hơn nữa, bạn sẽ thấy một lý do khác tại sao việc hỗ trợ parameter lại là một phần quan trọng của thư viện ADO.NET.
Thực thi một Stored Procedure
Ngoài việc tạo các chuỗi lệnh SQL, bạn phải thiết lập SqlCommand để thực thi stored procedure. Có hai bước để làm điều này: cho đối tượng SqlCommand biết stored procedure nào sẽ được thực thi và thiết lập chế độ thực thi stored procedure cho SqlCommand. Hai bước này được minh họa trong đoạn mã sau:
3 | SqlCommand cmd = new SqlCommand( |
4 | "Ten Most Expensive Products" , conn); |
8 | cmd.CommandType = CommandType.StoredProcedure; |
Khi khai báo đối tượng SqlCommand trên, tham số đầu tiên được gán là “Ten Most Expensive Products”. Đây là tên của stored procedure trong database Northwind. Tham số thứ hai là đối tượng connection, tương tự như constructor của SqlCommand dùng để thực thi một câu truy vấn.
Dòng lệnh thứ hai chỉ cho đối tượng SqlCommand kiểu của lệnh sẽ được thực thi bằng cách gán property CommandType thành giá trị StoredProcedure của enum CommandType. Bằng cách thay đổi property CommandType này, SqlCommand sẽ hiểu được chuỗi lệnh trong tham số thứ nhất là một stored procedure. Phần còn lại của đoạn mã có thể được viết tương tự như các bài trước.
Truyền Parameter cho Stored Procedure
Dùng parameter cho stored procedure tương tự như dùng cho chuỗi lệnh truy vấn. Đoạn code sau cho thấy cách làm điều này:
03 | SqlCommand cmd = new SqlCommand( "CustOrderHist" , conn); |
07 | cmd.CommandType = CommandType.StoredProcedure; |
11 | cmd.Parameters.Add( new SqlParameter( "@CustomerID" , custId)); |
Constructor của SqlCommand trên xác định tên của stored procedure, CustOrderHist, trong tham số đầu tiên. Stored procedure này nhận một tham số, tên là @CustomerID. Do đó, chúng ta phải tạo một parameter bằng cách dùng đối tượng SqlParameter. Tên của parameter được truyền trong tham số đầu tiên của SqlParameter constructor phải giống với tên của tham số của stored procedure. Sau đó thực thi command giống như bạn làm với các đối tượng SqlCommand khác.
Một ví dụ hoàn chỉnh
Mã lênh trong Listing chứa một ví dụ hoàn chỉnh minh họa cách dùng stored procedure. Có các phương thức được tách riêng cho một stored procedure không tham số và cho stored procedure có tham số.
Listing 1: Executing Stored Procedures
003 | using System.Data.SqlClient; |
009 | StoredProcDemo spd = new StoredProcDemo(); |
015 | spd.RunStoredProcParams(); |
019 | public void RunStoredProc() |
021 | SqlConnection conn = null ; |
022 | SqlDataReader rdr = null ; |
024 | Console.WriteLine( "\nTop 10 Most Expensive Products:\n" ); |
030 | SqlConnection( "Server=(local);DataBase=Northwind;Integrated Security=SSPI" ); |
035 | SqlCommand cmd = new SqlCommand( |
036 | "Ten Most Expensive Products" , conn); |
040 | cmd.CommandType = CommandType.StoredProcedure; |
043 | rdr = cmd.ExecuteReader(); |
049 | "Product: {0,-25} Price: ${1,6:####.00}" , |
050 | rdr[ "TenMostExpensiveProducts" ], |
068 | public void RunStoredProcParams() |
070 | SqlConnection conn = null ; |
071 | SqlDataReader rdr = null ; |
075 | string custId = "FURIB" ; |
077 | Console.WriteLine( "\nCustomer Order History:\n" ); |
083 | SqlConnection( "Server=(local);DataBase=Northwind;Integrated Security=SSPI" ); |
088 | SqlCommand cmd = new SqlCommand( |
089 | "CustOrderHist" , conn); |
093 | cmd.CommandType = CommandType.StoredProcedure; |
098 | new SqlParameter( "@CustomerID" , custId)); |
101 | rdr = cmd.ExecuteReader(); |
107 | "Product: {0,-35} Total: {1,2}" , |
Phương thức RunStoredProc() trong Listing 1 đơn giản là chạy một stored procedure và in kết quả ra console. Trong phương thức RunStoredProcParams(), stored procedure nhận một tham số. Điều này cho thấy không có sự khác biệt giữa việc dùng tham số với chuỗi truy vấn và stored procedure. Các mã lệnh còn lại khá quen thuộc nếu bạn đã đọc các bài trước đây trong tutorial này.
Tổng kết
Để thực thi stored procedure, bạn cần chỉ ra tên của stored procedure trong tham số đầu tiên của một SqlCommand constructor và sau đó gán property CommandType của SqlCommand thành StoredProcedured. Bạn cũng có thể truyền các tham số cho một stored procedure bằng cách dùng đối tượng SqlParameter, tương tự như cách làm với đối tượng SqlCommand dùng để thực thi một câu truy vấn. Mỗi lần đối tượng SqlCommand được tạo, bạn có thể dùng nó giống như các đối tượng SqlCommand được mô tả trong các bài trước.
——-
Nguồn tham khảo: http://www.csharp-station.com/Tutorials/AdoDotNet/lesson07.aspx
0 nhận xét