logo

Sử dụng ObjectDataSource với lớp truy cập CSDL


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. Ứ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 để truy cập CSDL 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 description for BL_Main /// [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 ListSqlParam = new List(); 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ới sự 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; }  
DMCA.com Protection Status Copyright by webtailieu.net