Thao tác Database thông qua Stored Procedure

change in gridview using asp.net

Hướng dẫn cách thao tác dữ liệu giữa data-table và Stored Procedure

I. Introduction
Bài viết sau sẽ hướng dẫn các bạn cách thao tác dữ liệu với database thông qua Stored Procedure.
II.Advantages
1. Với mỗi sự kiện trên trang sẽ không phải thao tác trực tiếp với database.
2. Tất cả các phương thức như:

1. Insert một bản ghi mới
2. Update một bản ghi đã tồn tại
3. Delete một bản ghi đã tồn tại.

Tất cả đều được thực hiện trên client side. Nó sẽ chỉ gọi tới database sau khi đã nhận đầy đủ thông tin từ user. Do đó, ứng dụng sẽ chạy nhanh hơn rất nhiều.
3. Sau khi tiến trình chắc chắn thực hiện (như Insert, delete, update…) trên gridview, dữ liệu sẽ được lưu vào “session”. Và bất cứ khi nào dữ liệu được yêu cầu cũng có thể lấy ra từ session này.
4. Chúng ta gửi dữ liệu từ session từ datatable bằng tay. Và sau đó, với sự trợ giúp của Stored Procedure thì chúng ta có thể insert, delete, update.
5. Tại một thời điểm, với mỗi hàng thì việc thao tác cũng dễ dàng hơn
6. User có thể thao tác với hàng nghìn bản ghi chỉ với một phiên kết nối.
7. Mở rộng ra có thể thao tác với function trong database.
III. Using the Code
Khi trang được load lần đầu tiên, dữ liệu từ database được load tới data-table. Trong data-table này, một cột sẽ được thêm vào (như “Operation”). Bất cứ lúc nào,user có thể thực hiện các thao tác trên grid-view, một biến bit sẽ được thêm vào cột của bản ghi đó (như Insert-0, delete-1, update-2). Nếu user click vào link update một hàng, thì giá trị cột đó sẽ tự động cập nhật là 2, và sự kiện RowDataBound của grid-view cũng sẽ có giá trị là 2. Lúc này, một bảng tạm sẽ được lưu trong phiên session đó. Sau đó, nó căn cứ vào giá trị lấy được để thực hiện các công việc tương ứng.
Bước 1: Khai báo biến toàn cục

[PHP]
private clsEmpDetails _objEmpDetails;
private DataTable _dtEmpDetails;
private DataTable _dtEmpDetailsVals;
[/PHP]

Bước 2: Khởi tạo dữ liệu thành viên trong hàm Page_Load

[PHP]
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
_objEmpDetails = new clsEmpDetails();
_dtEmpDetails = _objEmpDetails.fnGetDetails();

//Adding a new column to the table which will store the operation details
//For new insert it will store 1
//For updating the existing record it will store 0
_dtEmpDetails.Columns.Add(“Operation”, typeof(string));
Session[“EmpDetails”] = _dtEmpDetails;
gvEmpDetails.DataSource = _dtEmpDetails;
gvEmpDetails.DataBind();
}
}
[/PHP]

Dữ liệu được lưu trong session, và chúng ta sẽ dùng các thao tác riêng biệt đối tới từng sự kiện để lấy ra thông tin đó.

[PHP]
protected void gvEmpDetails_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == “AddNew”)
{
_dtEmpDetails = new DataTable();
_dtEmpDetails = Session[“EmpDetails”] as DataTable;
string strID = ((TextBox)gvEmpDetails.FooterRow.Cells[0].FindControl(“txtInsID”)).Text;
string strName = ((TextBox)gvEmpDetails.FooterRow.Cells[1].FindControl(“txtInsName”)).Text;
string strAddress = ((TextBox)gvEmpDetails.FooterRow.Cells[1].FindControl(“txtInsAddress”)).Text;
_dtEmpDetails.Rows.Add(strID, strName, strAddress, “0”);
Session[“EmpDetails”] = _dtEmpDetails;
fnBindEmpDetails(); //This function will bind the data to the gridview by fetching the data from session
}
}
[/PHP]

Với mỗi lần click trên, thì nó sẽ thực hiện gọi các hàm tương ứng bởi các parameter trong database của bạn

[PHP]
public string fnStoredProc(DataTable dtDetails)
{
string strMsg = “”;
try
{
fnConOpen();//Function for opening connection
SqlCommand cmdProc = new SqlCommand(“spEmpDetails”, con);
cmdProc.CommandType = CommandType.StoredProcedure;
cmdProc.Parameters.AddWithValue(“@Type”, “InsertDetails”);
cmdProc.Parameters.AddWithValue(“@Details”, dtDetails);
cmdProc.ExecuteNonQuery();
strMsg = “Saved successfully.”;
}
catch (SqlException e) {
//strMsg = “Data not saved successfully.”;
strMsg = e.Message.ToString();
}
finally
{
fnConClose();//Function for closing connection

}
return strMsg;
}
[/PHP]

IV. Procedure Structure
Đầu tiên ta khởi tạo một table với các cột như sau:

[PHP]
/*Creating type for the procedure parameter*/
CREATE TYPE EmpType AS TABLE
(
ID INT, Name VARCHAR(3000), Address VARCHAR(8000), Operation SMALLINT
)
[/PHP]

Viết phương thức Stored Procedure

[PHP]
ALTER PROCEDURE spEmpDetails
@Type VARCHAR(15),
@Details EmpType READONLY
AS
BEGIN
IF(@Type=’FetchDetails’)
SELECT * FROM EmployeeDetails
ELSE
BEGIN

–For deleting the details from the table
DELETE FROM EmployeeDetails WHERE ID IN(SELECT ID FROM @Details WHERE Operation=2)

–For updating the details in the table
UPDATE e SET e.Name=d.Name, e.Address=d.Address FROM EmployeeDetails e, @Details d
WHERE d.ID=e.ID and d.Operation=1

–For inserting the new records in the table
INSERT INTO EmployeeDetails(ID, Name, Address)
SELECT ID, Name, Address FROM @Details WHERE Operation=0;

END
END
GO
[/PHP]
Hy vọng với bài viết trên, các bạn sẽ nắm chắc được cách thức thao tác dữ liệu sử dụng Stored Procedure trong database server. Ngoài ra các bạn có thể download mã nguồn về ngâm cứu
Download Code

Nguyễn Trung Hiếu

Một blogger ... cùi bắp! Đơn giản: tôi muốn ghi lại những gì xảy ra xung quanh, cả công việc lẫn cuộc sống và chia sẻ với các bạn đọc. Nếu bạn cảm thấy bài viết có nhiều điểm không chính xác, hãy comment và chia sẻ để tôi còn được học hỏi từ những góp ý của bạn. Email: hieunt.dcn@gmail.com