Lập trình trên nền Web - 28

cmd.Parameters.AddWithValue("@state", txtState.Text); cmd.Parameters.AddWithValue("@zip", txtZip.Text); cmd.Parameters.AddWithValue("@contract", Convert.ToInt16(chkContract.Checked)); cmd.Parameters.AddWithValue("@au_id_original", lstAuthor.SelectedItem.Value); int updated = 0;

try

{

con.Open();

updated = cmd.ExecuteNonQuery();

lblResults.Text = updated.ToString() + " record updated.";

}

catch (Exception err)

{

lblResults.Text = "Error updating author. "; lblResults.Text += err.Message;

}

finally

{

con.Close();

}

if (updated > 0)

{

FillAuthorList();

}

}

protected void cmdDelete_Click(object sender, EventArgs e)

{

string deleteSQL;

deleteSQL = "DELETE FROM Authors "; deleteSQL += "WHERE au_id=@au_id";

SqlConnection con = new SqlConnection(connectionString); SqlCommand cmd = new SqlCommand(deleteSQL, con);

cmd.Parameters.AddWithValue("@au_id ", lstAuthor.SelectedItem.Value); int deleted = 0;

try

{

con.Open();

deleted = cmd.ExecuteNonQuery(); lblResults.Text = "Record deleted.";

}

catch (Exception err)

{

lblResults.Text = "Error deleting author. "; lblResults.Text += err.Message;

}

finally

{

con.Close();

}

if (deleted > 0)

{

FillAuthorList();

}

}

}

4.5.3. Lớp DataReader

Khi đã thiết lập một kết nối thực sự và câu lệnh SQL, bước tiếp theo là submit truy vấn đến nguồn dữ liệu. Kiểu DbDataReader (mà thực thi giao diện IDataReader) là cách đơn giản và chắc chắn đế lấy ra thông tin từ một kho dữ liệu.

Các đối tượng DataReader thu được từ đối tượng Command qua lời gọi đến ExecuteReader(). Khi làm viêc với phương thức này, có thể đóng một cách tự động đối tượng kết nối có liên quan bới việc chỉ rò CommandBehavior.CloseConnection.

Việc sử dụng phương thức Read() của DataReader để duyệt qua các mẫu tin, (trả ra giá trị false nếu duyêt qua mẫu tin cuối cùng). Chú ý rằng gọi Close() ngay khi kết thúc việc xử lý các mẫu tin để giải phóng đối tượng kết nối:

Indexer của một đối tượng DataReader đã được overload để lấy một chuỗi (string) (miêu tả tên của cột) hoặc một int (miêu tả số thứ tự của cột). Do đó, có thể tránh các tên chuỗi hard-code với việc cập nhật dưới đây (chú ý sử dụng thuộc tính FieldCount)

Ví dụ: Tạo trang AuthorBrowser.aspx thực hiện đọc nội dung của bảng Authors trong cơ sở dữ liệu Pubs và đưa vào một DropdownList. Khi chọn một giá trị trong DropdownList nội dung mẫu tin lựa chọn sẽ được hiển thị trên trang.

Hình 4 8 Giao diện trang AuthorBrowser aspx Nội dung thiết kế trang AuthorBrowser aspx 1

Hình 4.8. Giao diện trang AuthorBrowser.aspx

Nội dung thiết kế trang AuthorBrowser.aspx

<form id="form1" runat="Server">

<div>

<asp:label id="Label1" runat="Server" Width="120px" Height="20px">Select Author:</asp:label>&nbsp;

<asp:dropdownlist id="lstAuthor" runat="Server" Width="256px" Height="22px" AutoPostBack="True" onselectedindexchanged= "lstAuthor_SelectedIndexChanged"> </asp:dropdownlist> <br />

<asp:label id="lblResults" runat="Server" Width="384px" Height="168px">

</asp:label>

</div>

</form>

Nội dung trang trang AuthorBrowser.aspx.cs

public partial class AuthorBrowser : System.Web.UI.Page

{

private string connectionString = WebConfigurationManager.ConnectionStrings["Pubs"].ConnectionString; protected void Page_Load(object sender, EventArgs e)

{

if (!this.IsPostBack)

{

FillAuthorList();

}

}

private void FillAuthorList()

{


try

{

lstAuthor.Items.Clear();

string selectSQL = "SELECT au_lname, au_fname, au_id FROM Authors"; SqlConnection con = new SqlConnection(connectionString);

SqlCommand cmd = new SqlCommand(selectSQL, con); SqlDataReader reader;


con.Open();

reader = cmd.ExecuteReader(); while (reader.Read())

{

ListItem newItem = new ListItem();

newItem.Text = reader["au_lname"] + ", " + reader["au_fname"]; newItem.Value = reader["au_id"].ToString(); lstAuthor.Items.Add(newItem);

}

reader.Close();

}

catch (Exception err)

{

lblResults.Text = "Error reading list of names. "; lblResults.Text += err.Message;

}

finally

{

con.Close();

}

}

protected void lstAuthor_SelectedIndexChanged(object sender, EventArgs e)

{

string selectSQL;

selectSQL = "SELECT * FROM Authors ";

selectSQL += "WHERE au_id='" + lstAuthor.SelectedItem.Value + "'"; SqlConnection con = new SqlConnection(connectionString);

SqlCommand cmd = new SqlCommand(selectSQL, con); SqlDataReader reader;

try

{

con.Open();

reader = cmd.ExecuteReader(); reader.Read();

StringBuilder sb = new StringBuilder(); sb.Append("<b>"); sb.Append(reader["au_lname"]); sb.Append(", "); sb.Append(reader["au_fname"]); sb.Append("</b><br />"); sb.Append("Phone: "); sb.Append(reader["phone"]); sb.Append("<br />");

sb.Append("Address: "); sb.Append(reader["address"]); sb.Append("<br />");

sb.Append("City: ");

sb.Append(reader["city"]);

sb.Append("<br />");

sb.Append("State: "); sb.Append(reader["state"]); sb.Append("<br />"); lblResults.Text = sb.ToString(); reader.Close();

}

catch (Exception err)

{

lblResults.Text = "Error getting author. "; lblResults.Text += err.Message;

}

finally

{

con.Close();

}

}

}

Các đối tượng DataReader có thể thu được nhiều bộ kết quả sử dụng một đối tượng Command. Vid dụ, để thu được tất cả các dòng từ bảng Inventory cũng như từ bảng Customers có thể chỉ định các câu lệnh SQL select sử dụng dấu chấm phẩy (;) cuối dòng:

string strSQL = "Select * From Inventory; Select * from Customers";

Khi thu được DataReader ta có thể duyệt qua các mẫu tin thông qua phương thức NextResult().

do{

while (myDataReader.Read())

{

for (int i = 0; i < myDataReader.FieldCount; i++)

{

myDataReader.GetName(i); myDataReader.GetValue(i).ToString().Trim();

}

}

} while (myDataReader.NextResult());

4.5.4. Lớp DataAdapter

Đóng vai trò cầu nối chuyển đổi dữ liệu giữa nguồn dữ liệu (DataSource) và các đối tượng thao tác dữ liệu (DataSet).

Ví dụ Hình 4 9 Cơ chế làm việc của DataAdapter SqlDataAdapter da new 2



Ví dụ:

Hình 4.9. Cơ chế làm việc của DataAdapter


SqlDataAdapter da = new SqlDataAdapter(“SELECT * FROM Orders”, “Server=localhost; database=Northwind; user id=sa; password=sa”); DataSet ds = new DataSet();

da.Fill(ds); da.Update(ds);

4.5.5. Lớp DataSet

Khi sử dụng ngắt kết nối của ADO.NET sẽ thu được những đối tượng DataSet thường trú sử dụng đối tượng DataAdapter của trình cung cấp dữ liệu. Chức năng của đối tượng DataAdapter như một cầu nối giữa tầng client và một cơ sở dữ liệu quan hệ. Đối tượng DataAdapter của trình cung cấp dữ liệu xử lý việc kết nối cơ sở dữ liệu một cách tự động. Khi đối tượng gọi nhận được đối tượng DataSet, tầng gọi bị ngắt kết nối từ cơ sở dữ liệu và rời khỏi với một bản sao cục bộ của dữ liệu. Đối tượng gọi có thể insert, delete, hoặc update những hàng từ một DataTable đã cho, nhưng cơ sở dữ liệu vật lý không được cập nhật đến khi đối tượng gọi chuyển DataSet tới DataAdapter để cập nhật.

DataSet là một thể hiện của dữ liệu quan hệ. Một DataSet là một lớp chứa ba colection bên trong.

Hình 4 10 Mô hình của DataSet Thuộc tính Tables của DataSet cho phép truy xuất 3

Hình 4.10. Mô hình của DataSet

Thuộc tính Tables của DataSet cho phép truy xuất DataTableCollection chứa các DataTable riêng lẻ. Một DataSet có thể được sử dụng để thể hiện những mối quan hệ cha/con giữa các bảng của nó. Chẳng hạn, một quan hệ có thể được tạo ra giữa hai bảng để mô hình một sự ràng buộc khóa ngoại sử dụng kiểu DataRelation. Đối tượng này có thể sau đó được thêm vào DataRelationCollection thông qua thuộc tính Relations.

Các thuộc tính chính của DataSet


Thuộc tính

Ý nghĩa

CaseSensitive

Cho biết có phải những chuỗi trong đối tượng DataTable là

phân biệt hoa/thường hay không.

DataSetName

Thể hiện tên một cách thân thiện của DataSet này.

EnforceConstraints

Đưa ra hay thiết lập một giá trị cho biết có những quy tắc ràng

buộc hay không.

HasErrors

Đưa ra một giá trị cho biết có những lỗi trong bất kỳ hàng nào

trong DataTables của DataSet hay không .

RemotingFormat

Cho phép định nghĩa cách DataSet xuất nội dung của nó ( nhị

phân hay XML).

Có thể bạn quan tâm!

Xem toàn bộ 285 trang tài liệu này.

DataSet cung cấp những phương thức mà cho phép sao chép nội dung DataSet, điều hướng giữa những bảng bên trong và thiết lập những điểm bắt đầu và kết thúc của một lô những sự cập nhật.

Các phương thức quan trọng của DataSet


Phương thức

Ý nghĩa

AcceptChanges()

Xác nhận mọi sự thay đổi gần nhất đến DataSet từ khi nó được

load hay AcceptChanges().

Clear()

Xóa hoàn toàn dữ liệu DataSet bằng việc loại bỏ mỗi hàng trong

mỗi DataTable

Clone()

Sao chép cấu trúc của DataSet, bao gồm mọi DataTables, cũng

như tất cả quan hệ và bất kỳ sự ràng buộc nào.

Copy()

Sao chép cả cấu trúc lẫn dữ liệu cho DataSet.

GetChanges()

Trả về một sự sao chép của DataSet chứa mọi sự thay đổi được

tạo ra nó khi nó được load gần nhất hay từ khi AcceptChanges() được gọi.

HasChanges()

Đưa ra một giá trị cho biết có phải DataSet có những sự thay

đổi hay không.

Merge()

Merge DataSet này với một DataSet xác định

ReadXml()

ReadXmlSchema()

Cho phép đọc dữ liệu XML vào trong DataSet.

RejectChanges()

Quay trở lại mọi sự thay đổi gần nhất đối với DataSet từ khi nó

được khởi tạo hay AcceptChanges().

WriteXml()

WriteXmlSchema()

Cho phép ghi nội dung của một DataSet ra XML.

4.5.6. Lớp DataColumns

DataColumn thể hiện một cột đơn bên trong một DataTable. DataColumn thể hiện sự thiết lập thông tin mô hình của bảng. Chẳng hạn, mô hình bảng Inventory của cơ sở dữ liệu AutoLot, sẽ tạo ra bốn DataColumns, với mỗi cột (CarID, Make, Color và PetName). Mỗi khi khởi tạo các đối tượng DataColumn, chúng được thêm vào trong colection Columns của kiểu DataTable (thông qua thuộc tính Column).

Các thuộc tính của DataColumn:


Thuộc tính

Ý nghĩa

AllowDBNull

Thuộc tính này được dùng nếu một hàng có thể có giá trị null

trong

cột này. Giá trị mặc định là true.

AutoIncrement AutoIncrementSeed AutoIncrementStep

Những thuộc tính này được dùng để cấu hình việc tăng tự động (autoincrement behavior) cho một cột nhất định. Điều Nó được dùng khi muốn bảo đảm những giá trị là duy nhất trong một DataColumn đã. Theo mặc định, một DataColumn không hỗ trợ tăng

tự động.

Caption

Thuộc tính này dung để thiết lập caption sẽ được hiển thị cho cột này.

ColumnMapping

Thuộc tính này xác định cách một DataColumn được thể hiện khi một DataSet được lưu giữ như một tài liệu XML sử dụng phương thức DataSet.WriteXml().

ColumnName

Thuộc tính này thiết lập tên của cột trong colection Columns. Nếu không đặt ColumnName rò ràng, thì giá trị mặc định là Column với hậu tố số (n +1) ( ví dụ., Column1, Column2,

Column3,...).

DataType

Thuộc tính này định nghĩa kiểu dữ liệu (Boolean, string, float,...) được lưu giữ trong cột.

DefaultValue

Thuộc tính này thiết lập giá trị mặc định được gán đến cột khi chèn những hàng mới.

Expression

Thuộc tính này thiết lập biểu thức được sử dụng để lọc các hàng, tính toán một giá trị của cột, hoặc tạo ra một cột kết hợp.

Ordinal

Thuộc tính này đưa ra vị trí của cột trong colection Columns.

ReadOnly

Thuộc tính này xác định nếu chỉ được sửa đổi một lần khi được thêm vào bảng. Mặc định là false.

Table

Thuộc tính này đưa ra DataTable chứa DataColumn.

Unique

Thuộc tính này thiết lập một giá trị cho biết có phải những giá trị trong mỗi hàng của cột là duy nhất hay không. Nếu một cột được gán một ràng buộc khóa chính, thuộc tính Unique nên được thiết lập là true.

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 16/07/2022