SửdụngObjectDataSourcevớilớptruycậpCSDL
. Trong bài viết này, các bạn sẽ biết cách sửdụng
ObjectDataSource vơilớpTruycập CSDL, DA.dll. Ứng dụng
được viết bằng ngôn ngũ C# và T - SQL.
Các điều khiển ObjectDataSource có thể giúp bạn giảm một số
lượng các dòng code một cách đáng kể, và cả thời gian nữa chứ.
Công việc mà chúng ta phải làm theo các bước sau: Bind một
điều khiển ObjectDataSource tới điều khiển GridView mà cho
phép Select, insert, update và delete đối với bảng có tên là
S_PERSON (với 3 cột Person_ID là khóa chính, FirstName và LastName). Ta sửdụng Asembly
đã được biên dịch để truycậpCSDL và Stored Procedure để thao tác với bảng S_PERSON.
Thêm một form có tên là Person trong project của bạn. tạo tham chiều đến DA.dll (nếu có sẵn rồi
thì không cần nữa); Thêm một lớp có tên là BL_Main.cs vào thư mục App_Code. Project của
chúng ta sẽ như hình bên dưới. (Đừng để ý đến các lớp khác và thư mục khác, đó chỉ là phần test
của tôi.)
Hình Ảnh 1.
tạo một form có tên là Person gồm các điều khiển theo hình th
ứ 2:
Hình Ảnh 2:
Bây giờ, chúng ta đã sẵn sàng viết code cho các lớp và Stored Procedure. Chúng ta sẽ làm chi tiết
trường hợp Update. bởi vì đó là nhiệm vụ khá thú vị và phức tạp. Để update bảng, chúng ta cần
phải truyền vào ít nhất 4 tham số; 3 tham số cho việc update và 1 tham số cho khóa chính (Đối
với hàng được update) chúng ta sẽ nhận được vài thông báo khi update.
Trước tiên, chúng ta sẽ viết Stored Procedure có tên là úp_S_PERSON_Update, cho phép chúng
ta update bảng S_PERSON. Để cho đơn giản hơn, chúng ta sẽ không sửdụng "Try - catch" và
các bẫ
y lỗi. Stored của chúng ta sẽ như sau:
USE MICLIV;
GO
IF OBJECT_ID ( '[dbo].[usp_S_Persons_Update]', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.usp_S_Persons_Update;
GO
CREATE PROCEDURE dbo.usp_S_Persons_Update
@original_Person_ID nvarchar(9),
@Person_ID nvarchar(9),
@FirstName nvarchar(50),
@LastName nvarchar(50)
AS
if
(
not exists(select 1 from dbo.S_Persons where Person_ID = @Person_ID and
@original_Person_ID <> @Person_ID)
)
begin
update dbo.S_Persons
set
Person_ID = @Person_ID,
LastName = @LastName,
FirstName = @FirstName
where Person_ID = @original_Person_ID;
end
GO
Tương tự như vậy, ta viết các stored khác procedures usp_S_Persons_Insert,
usp_S_Persons_Select, usp_S_Persons_Delete.
Bây giờ chúng ta đã có các Stored và sãn sàng viết code cho lớp BL_Main. Class này sẽ phù hợp
với việc Bind đến ObjectDataSource, chúng ta sẽ thêm các thuộc tính:
[DataObject(true)]
public class BL_Main
{
Nếu chúng ta check vào hộp "Show Only Data Components" thì chúng ta sẽ chỉ nhìn thấy lớp
duy nhất của mình.
Hình Ảnh 3:
Bây giờ, ta sửdụng DA.dll (hãy nhớ rằng chúng ta đã tạo tham chiếu đến nó). Chúng ta sẽ viết
phương thức usp_S_Persons_Update cho việc update dữ liệu
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.ComponentModel;
using System.Collections.Generic;
/// <summary>
/// Summary description for BL_Main
/// </summary>
[DataObject(true)]
public class BL_Main
{
public BL_Main()
{
//
// TODO: Add constructor logic here
//
}
#region "forClass"
DA.DataAccess data_Acc = new DA.DataAccess(ConfigurationManager.
ConnectionStrings["MICLIVConnectionString"].ConnectionString);
#endregion
[DataObjectMethod(DataObjectMethodType.Update)]
public string usp_S_Persons_Update(string original_Person_ID,
string Person_ID, string FirstName, string LastName)
{
string sNameSP = "usp_S_Persons_Update";
List<SqlParameter> ListSqlParam = new List<SqlParameter>();
SqlParameter sqlParam0 = new SqlParameter("@original_Person_ID", original_Person_ID);
ListSqlParam.Add(sqlParam0);
SqlParameter sqlParam1 = new SqlParameter("@Person_ID", Person_ID);
ListSqlParam.Add(sqlParam1);
SqlParameter sqlParam2 = new SqlParameter("@FirstName", FirstName);
ListSqlParam.Add(sqlParam2);
SqlParameter sqlParam3 = new SqlParameter("@LastName", LastName);
ListSqlParam.Add(sqlParam3);
return (data_Acc.execNonQuery(ListSqlParam, sNameSP));
}
//Similar code for usp_S_Persons_Delete,usp_S_Persons_Insert,
//usp_S_Persons_Select methods
}
như đã thấy, chúng ta se sửdụng thuộc tính
[DataObjectMethod(DataObjectMethodType.Update)] đểu cho phép chỉ lựa chọn phương thức
đó vcho việc update, xem hình 4
Hình Ảnh 4:
Chúng ta sẽ sửdụng thuộc tình tương tự cho việc select, insert và delete
Có một số chú ý về tham số original_Person_ID. (hãy xem Storef ở bên dưới) Trường khóa
chính có thể được update (Chúng ta cần giá trị khóa ban đầu để nhận các bản ghi sẽ được update)
và bởi vì giá trị cũ của khóa chính sẽ được truyền vào tham số "original_{0}" (Theo hình 5). Tất
nhiên, chúng ta có thể thay đổi (nếu chúng ta muốn) thiết lập cho thuộc tính
OldValuesParameterFormatString của đối tượng ObjectDataSourcePersons (vd, với
"old_Person_Id") .
Hình Ảnh 5:
Có một điểm bạn cần phải lưu ý: mọi phương thức của DA.dll đều trả lại giá trị. Trong trường
hợp "NonQuery" như ( delete, insert, update ) sẽ trả lại giá trị là một chuỗi. Nếu quá trình được
thực hiện thành công, Chuỗi giá trị trả về sẽ như sau: "OK;6 rows affected". Nếu quá trình thực
hiện thất bại, chuỗi giá trị trả về sẽ là thông báo lỗi.
Chuỗi trả về, bạn có thể bắt vớisự giúp đỡ của sự kiện ObjectDataSource (hình 6) và thuộc tình
của ObjectDataSourceStatusEventArgs như là giá trị trả về.
Hình Ảnh 6:
Ví dụ, bạn muốn thông báo người dùng mà thuộc tính Person_Id đã tồn tại trong khi chúng ta cố
gắng thay đổi giá trị Person_Id ban đầu. Trong trường hợp đó, (theo các stored trong DA.dll)
không có dòng nào được hiển thị nhưng tiến trình sẽ vần được hoàn thành mà không có lỗi nào.
Trong mọi trường hợp khác, thông tin về tiến trình sẽ chỉ là giá trị trả về của phương thức. chúng
ta có thể thực thi công việc đó bằng các đoạn code sau đây mà chúng ta thêm vào phương thức
ObjectDataSurcePersons_Updated (trong Persons.aspx)
protected void ObjectDataSurcePersons_Updated(object sender,
ObjectDataSourceStatusEventArgs e)
{
string sMessage = e.ReturnValue.ToString();
if (sMessage.Contains("OK;-1"))
{
sMessage = "The Person_ID, to which you want to change" +
" original Person_ID, already exists!";
}
LabelMessage.Text = sMessage;
}
. Sử dụng ObjectDataSource với lớp truy cập CSDL
. Trong bài viết này, các bạn sẽ biết cách sử dụng
ObjectDataSource vơi lớp Truy cập CSDL, DA.dll chính, FirstName và LastName). Ta sử dụng Asembly
đã được biên dịch để truy cập CSDL và Stored Procedure để thao tác với bảng S_PERSON.
Thêm một form