web 中运用 ado.net

25
WEB 中中中 ADO.NET 中中 ADO.NET 中中中中中中中 ADO.NET 中中中中中中 中中 中中中中中中 [ 中中中中中中中 ] 中中中中中中中中中中中 中中中中中中中中中中 中中中中中中中中中 中中中中

Upload: garin

Post on 21-Jan-2016

83 views

Category:

Documents


0 download

DESCRIPTION

WEB 中运用 ADO.NET. 利用 ADO.NET 存储和检索数据 ADO.NET 如何引用对象 添加、更改和删除行[基于设计模式下] 在运行时创建数据库连接 在列表控件中显示数据 在数据库上执行命令 处理事务. 利用 ADO . NET 存储和检索数据. 利用 ADO . NET 存储和检索数据 ADO.NET 如何引用对象 在设计模式下创建连接、适配器和数据集对象时 ,会为这些对象启用数据类型化,这时我们可以 使用数据库架构中的专有名称来标识表、行和域 。但在运行时,创建对象,我们就需要使用非类 型化引用。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: WEB 中运用 ADO.NET

WEB 中运用 ADO.NET

利用 ADO.NET 存储和检索数据 ADO.NET 如何引用对象 添加、更改和删除行 [基于设计模式下 ]

在运行时创建数据库连接 在列表控件中显示数据 在数据库上执行命令 处理事务

Page 2: WEB 中运用 ADO.NET

利用 ADO.NET 存储和检索数据 ADO.NET 如何引用对象 在设计模式下创建连接、适配器和数据集对象时

,会为这些对象启用数据类型化,这时我们可以

使用数据库架构中的专有名称来标识表、行和域

。但在运行时,创建对象,我们就需要使用非类

型化引用。

利用 ADO.NET 存储和检索数据

Page 3: WEB 中运用 ADO.NET

添加、更改和删除行 [基于设计模式下 ] 添加行

// 对 Contacts表的 HomePhone列的类型化引用DataSet1.Contacts.HomePhoneColumn.Caption = "@Home";//对 Contacts表的 HomePhone列的非类型化引用DataSet1.Tables["Contacts"].Columns["HomePhone"].Caption = "@Home";

// 对 Contacts表的 HomePhone列的类型化引用DataSet1.Contacts.HomePhoneColumn.Caption = "@Home";//对 Contacts表的 HomePhone列的非类型化引用DataSet1.Tables["Contacts"].Columns["HomePhone"].Caption = "@Home";

// 为 Contacts表创建一个新的对象DataSet1.ContactsRow rowNew = (DataSet1.ContactsRow)DataSet1.Contacts.NewRow();//将数据添加到行的列中rowNew.ContactID = 42;…//将新行添加到数据集DataSet1.Contacts.Rows.Add(rowNew);

// 为 Contacts表创建一个新的对象DataSet1.ContactsRow rowNew = (DataSet1.ContactsRow)DataSet1.Contacts.NewRow();//将数据添加到行的列中rowNew.ContactID = 42;…//将新行添加到数据集DataSet1.Contacts.Rows.Add(rowNew);

Page 4: WEB 中运用 ADO.NET

要更改 \删除数据集中的一行时,可以使用

FindBy方法从表中获取一个 Row对象,然后在行

中进行更改 \删除 更改//声明一个行对象DataSet1.ContactsRow rowChange;//使用主键获取要更改的行rowChange = DataSet1.Contacts.FindByContactID(42);//更改行中的字段rowChange.WorkPhone = "(555) 555-9000";

// 删除行rowDelete.Delete();

更改//声明一个行对象DataSet1.ContactsRow rowChange;//使用主键获取要更改的行rowChange = DataSet1.Contacts.FindByContactID(42);//更改行中的字段rowChange.WorkPhone = "(555) 555-9000";

// 删除行rowDelete.Delete();

Page 5: WEB 中运用 ADO.NET

从 DataSet更新 Database

在处理完页面上所有的控件事件后,通常都会执

行更新操作。通常在 Page_PreRender事件中调用

Update方法。 private void Page_PreRender() {// 利用在 DataSet对象中做的更改来更新数据库sqlDataAdapter1.Update(DataSet1);//刷新 DataGridDataGrid1.DataBind();}

private void Page_PreRender() {// 利用在 DataSet对象中做的更改来更新数据库sqlDataAdapter1.Update(DataSet1);//刷新 DataGridDataGrid1.DataBind();}

Page 6: WEB 中运用 ADO.NET

当我们从数据集中更新数据库, ADO.NET按照以下 步骤进行: 1、该数据集检查每一个 DataRow对象的 RowState 属性来确定对该数据集的更改。可能的属性值为 : Added\Deleted\Modified\Unchanged\Detached

2、调用适配器对象的 InsertCommand\DeletCommand\UpdateCommand属

性来完成数据库中做所需的更改。 3、将更新后的 DataRow对象的 RowState属性重

新 设为 Unchanged。 [ 见示例: ADO\WebForm1]

Page 7: WEB 中运用 ADO.NET

在运行时创建数据库连接 1、   创建连接对象 2、  创建数据适配器对象 3、  创建数据集对象 4、 在适配器对象上调用方法来填充或更新数据 集 5、使用数据绑定或其他技术显示来自该数据集 的数据 。

Page 8: WEB 中运用 ADO.NET

// 创建数据连接SqlConnection ContactMgmt = new SqlConnection("连接字符串 ");// 创建数据适配器SqlDataAdapter adptContactMgmt = new SqlDataAdapter("select * from Contacts", ContactMgmt);//创建数据集DataSet dsContacts = new DataSet();//填充数据集adptContactMgmt.Fill(dsContacts, "Contacts");//显示数据DataGrid1.DataSource = dsContacts.Tables["Contacts"].DefaultView;DataGrid1.DataBind();

// 创建数据连接SqlConnection ContactMgmt = new SqlConnection("连接字符串 ");// 创建数据适配器SqlDataAdapter adptContactMgmt = new SqlDataAdapter("select * from Contacts", ContactMgmt);//创建数据集DataSet dsContacts = new DataSet();//填充数据集adptContactMgmt.Fill(dsContacts, "Contacts");//显示数据DataGrid1.DataSource = dsContacts.Tables["Contacts"].DefaultView;DataGrid1.DataBind();

Page 9: WEB 中运用 ADO.NET

更新运行时的数据库连接 1、设置适配器对象的SelectCommand。使用其 CommandText属性为 InsertCommand\DeleteCommand\UpdateCommand 属性产生设置。 2、为适配器对象创建命令生成器对象

以下代码连接到一个数据库,创建一个数据集,产生命令,修改数据集,然后根据更改记录来更新数据库。 [ 见示例:ADO\CodeModeSql]

Page 10: WEB 中运用 ADO.NET

使用 Page 对象 Page 对象控制应用程序的用户界面。提供

了 WEB 编程时最常用的核心属性和方法。

// (1)创建数据库连接 // (2) 创建一个数据适配器SqlDataAdapter adptContactMgmt = new SqlDataAdapter("select * from Contacts", ContactMgmt);// (3)创建一个数据集 // (4)填充数据集// (5)绑定并显示数据 // (6)自动创建插入、删除和更新命令SqlCommandBuilder cmdContactMgmt = new SqlCommandBuilder(adptContactMgmt);// (7)创建新行DataRow rowInsert = dsContacts.Tables["Contacts"].NewRow();//将数据添加到行中的字段rowInsert["ContactID"] = 42;…//将该行添加进数据集中dsContacts.Tables["Contacts"].Rows.Add(rowInsert);// (8)更新数据库

// (1)创建数据库连接 // (2) 创建一个数据适配器SqlDataAdapter adptContactMgmt = new SqlDataAdapter("select * from Contacts", ContactMgmt);// (3)创建一个数据集 // (4)填充数据集// (5)绑定并显示数据 // (6)自动创建插入、删除和更新命令SqlCommandBuilder cmdContactMgmt = new SqlCommandBuilder(adptContactMgmt);// (7)创建新行DataRow rowInsert = dsContacts.Tables["Contacts"].NewRow();//将数据添加到行中的字段rowInsert["ContactID"] = 42;…//将该行添加进数据集中dsContacts.Tables["Contacts"].Rows.Add(rowInsert);// (8)更新数据库

Page 11: WEB 中运用 ADO.NET

在列表控件中显示数据 [ListBox\DropDownList\CheckBoxList\RadioBut

tonList]中显示数据集中项,有以下步骤: 1、将控件的DataSource属性设置为数据集的名称     

2、 将控件的DataText属性设置为数据集成员, 将其作为列表项的Text属性显示 3、 将控件的DataValue属性设置为该数据集成员 ,将其作为列表项的Value属性返回 4、在代码中,通过数据适配器填充该数据集并将 它绑定到该控件。

Page 12: WEB 中运用 ADO.NET

以 DropDownList为例:

private void Page_Load(){if(!IsPostBack){ adaptContacts.Fill(dsContacts); foreach( dsContacts.ContactsRow drowItem in dsContacts.Contacts) {

ListItem lstNew = new ListItem();lstNew.Text = drowItem.FirstName + “ “ +

drowItem.LastName;lstNew.Value = drowItem.ContactID.ToString();drpContacts.Items.Add(lstNew);

}}}

private void Page_Load(){if(!IsPostBack){ adaptContacts.Fill(dsContacts); foreach( dsContacts.ContactsRow drowItem in dsContacts.Contacts) {

ListItem lstNew = new ListItem();lstNew.Text = drowItem.FirstName + “ “ +

drowItem.LastName;lstNew.Value = drowItem.ContactID.ToString();drpContacts.Items.Add(lstNew);

}}}

Page 13: WEB 中运用 ADO.NET

选择特定记录 ,显示内容

示例[DataSet\ViewDataSet]

private void drpContacts_SelectedIndexChanged(){

adptCalls.SelectCommand.CommandText = “select * from calls where ContactID = ” +drpContacts.SelectedItem.Value;dsCalls.Clear();

adptCalls.Fill(dsCalls);grdCalls.DataBind();

}

private void drpContacts_SelectedIndexChanged(){

adptCalls.SelectCommand.CommandText = “select * from calls where ContactID = ” +drpContacts.SelectedItem.Value;dsCalls.Clear();

adptCalls.Fill(dsCalls);grdCalls.DataBind();

}

Page 14: WEB 中运用 ADO.NET

在数据库上执行命令 ExecuteScalar\ExecuteNonQuery\ExecuteReader // 获取新的唯一 ContactID. int intID;SqlCommand sqlcommNewID = new SqlCommand("SELECT MAX(ContactID)" +" FROM Contacts", sqlContactMgmt);//打开数据库连接 sqlContactMgmt.Open();intID = (int)sqlcommNewID.ExecuteScalar();// 为 Contacts表创建新的行对象dsContacts.ContactsRow rowNew = (dsContacts.ContactsRow) dsContacts.Contacts.NewRow();//将数据添加到行的字段rowNew.ContactID = intID + 1;//将该行添加到数据集中dsContacts.Contacts.AddContactsRow(rowNew);// 关闭连接

// 获取新的唯一 ContactID. int intID;SqlCommand sqlcommNewID = new SqlCommand("SELECT MAX(ContactID)" +" FROM Contacts", sqlContactMgmt);//打开数据库连接 sqlContactMgmt.Open();intID = (int)sqlcommNewID.ExecuteScalar();// 为 Contacts表创建新的行对象dsContacts.ContactsRow rowNew = (dsContacts.ContactsRow) dsContacts.Contacts.NewRow();//将数据添加到行的字段rowNew.ContactID = intID + 1;//将该行添加到数据集中dsContacts.Contacts.AddContactsRow(rowNew);// 关闭连接

Page 15: WEB 中运用 ADO.NET

删除//创建命令对象 // 打开连接//执行命令ExecuteNonQuery();//关闭连接 查询// 创建命令对象 // 打开连接//创建数据阅读器对象SqlDataReader readCalls//执行命令ExecuteReader();//显示数据while(readCalls.Read()){}//关闭阅读器 // 关闭连接

删除//创建命令对象 // 打开连接//执行命令ExecuteNonQuery();//关闭连接 查询// 创建命令对象 // 打开连接//创建数据阅读器对象SqlDataReader readCalls//执行命令ExecuteReader();//显示数据while(readCalls.Read()){}//关闭阅读器 // 关闭连接

Page 16: WEB 中运用 ADO.NET

示 例 [DataSet\SqlCommands\oleCommands]

处理事务 理解事务 事务是一组被看作一个单元的数据库命令。 如果命令有以下特点,它们就可以属于一个事务 1 、   原子性 它们组成一个工作单位。例如,如 果一个客户搬家了,你想要数据条目运算符将所 有的客户地址字段作为一个单元进行更改,而不 是先更改街道,然后更改城市等。

Page 17: WEB 中运用 ADO.NET

2 、一致性 在一个数据库 所有数据之间的关系 都得到正确的维护。例如:如果客户信息根据省 的税表使用税率,为该客户输入的省必须存在于 这个税表中。 3 、隔离性 其他客户所做的更改不能影响当前的 更改。 4 、持久性 一旦做了更改,就是持久的。如果在

一组命令完成之前出现系统错误或电源问题,这

些命令就会被撤消,而系统重新运行时,数据将

恢复到其原来的状态。

Page 18: WEB 中运用 ADO.NET

事务处理对于使用数据访问的 WEB应用程序而言特别

重要,因为 WEB应用程序是分布到很多不同的客户端

的。在一个 WEB应用程序中,数据库是共享的资源,

分布在广大地区的大量不同客户中将出现这些关键

问题: 1 、 争夺资源

2 、意外失败 Internet 并不是最可靠的网络环境,

即使你的 WEB应用程序和 WEB服务器是 100%可靠的。

客户可能因为他们的服务提供程序、电源、网络等

问题而断开连接

因为变量名错误,我们将不能获取所需数据。这

容易查找,但如果发生在更深的结构中,问题就

难发现了。

Page 19: WEB 中运用 ADO.NET

WEB 应用程序生存期 WEB 应用程序的生存期只存在

一个实例持续的时间,而且客户可以简单地在浏览

器中输入新地址而随时离开你的应用程序。

事务处理的一般步骤: 1 、 开始一项事务 2 、 处理数据库命令 3 、 检查错误

4 、如果错误发生,将数据库恢复到它在事务开始

时的状态;否则,就提交。

Page 20: WEB 中运用 ADO.NET

数据集事务 数据集通过RejectChanges和Update方法提供事务

处理。AcceptChanges方法,将数据集中的记录状

态重置为未更改。

Private void Page_Load(){ if(!IsPostBack) { adpt.Fill(dataset); Seesion[“DS”] = dataset; }else{ dataset = (dataset)Session[“DS”]; }dataGrid.DataBind();}

Private void Page_Load(){ if(!IsPostBack) { adpt.Fill(dataset); Seesion[“DS”] = dataset; }else{ dataset = (dataset)Session[“DS”]; }dataGrid.DataBind();}

Page 21: WEB 中运用 ADO.NET

private void grdContact_ItemCommand(){ if(e.CommandName == “Delete”) { int intContactID; intContactID = Convert.Int16 (grdContact.Items[e.Item.ItemIndex].Cell[3].Text); dataset.ContactsRow rowDel;  rowDel = dataset.Contacts.FindByContactID(intContactID); rowDel.Delete(); grdContact.DataBind();}}

private void grdContact_ItemCommand(){ if(e.CommandName == “Delete”) { int intContactID; intContactID = Convert.Int16 (grdContact.Items[e.Item.ItemIndex].Cell[3].Text); dataset.ContactsRow rowDel;  rowDel = dataset.Contacts.FindByContactID(intContactID); rowDel.Delete(); grdContact.DataBind();}}

Page 22: WEB 中运用 ADO.NET

ASP.NET 应用

恢复://将该数据集恢复到以前的状态dataset.RejectChanges();//刷新grdContact.DataBind(); 更新int intRows;intRows = adpt.Update(dataset);//将更改保存到状态变量中Session[“DS”] = dataset;

恢复://将该数据集恢复到以前的状态dataset.RejectChanges();//刷新grdContact.DataBind(); 更新int intRows;intRows = adpt.Update(dataset);//将更改保存到状态变量中Session[“DS”] = dataset;

AcceptChanes方法阻止 Update方法在数据库中完成更改,因为 Update使用行的 DataRowState属性来确定要在数据库中修改的行。而AcceptChanes的执行,使行的 DataRowState属性改为了 Unchanged。

Page 23: WEB 中运用 ADO.NET

数据库事务 要使用任何一种事务对象,按以下步骤: 1 、打开一个数据库连接 2 、使用数据库连接对象的 BeginTransaction 方法创建事务对象

3 、创建命令对象来跟踪该事务,将每个命令对象的Transaction属性设置为 2中的事务名称

4 、执行命令 5 、根据命令执行情况,提交或回滚事务

6、关闭数据库连接

Page 24: WEB 中运用 ADO.NET

示例:使用 DataGrid显示来自 Contacts数据库的联系

列表。 DataGrid包含了一列按钮。允许用户删除联系

项。 DeleteContact使用一个事务来确保如果联系项

被删除时该联系项的通话也被删除。 事务对象通过 IsolationLevel属性确定如何处理当前

对数据库的更改。

示例 [Transaction]

Page 25: WEB 中运用 ADO.NET

隔离级别 行为

ReadUncommitted

不锁定正在读取的记录。

Choas 和 ReadUncommitted 一样的行为方式,但是要在进行写操作时检查其他挂起事务的隔离级别

ReadCommitted

锁定正在读取的记录,并在记录被读取后立即解除锁定。但不会防止记录被事务处理期间的其他客户添加、删除或更改

ReapeatableRead

锁定正在读取的记录,并将锁定保持到事务处理完成为止。

Serializable

锁定整个被读取的数据集,并将锁定保持到事务处理完成为止。这保证了数据和它在数据库中的顺序在事务处理期间不会变化。