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
<form id="form1" runat="Server">
<div>
<asp:label id="Label1" runat="Server" Width="120px" Height="20px">Select Author:</asp:label>
<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 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 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
Ý 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!
- Vị Trí Của Ado.net Trong Kiến Trúc Của .net Framework
- Kết Nối Đến Cơ Sở Dữ Liệu Và Đọc Dữ Liệu
- Lập trình trên nền Web - 27
- Lập trình trên nền Web - 29
- Kết Quả Hiển Thị Trên Gridview
- Lập trình trên nền Web - 31
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
Ý 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:
Ý 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. |