1 / 25

WEB 中运用 ADO.NET

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

garin
Download Presentation

WEB 中运用 ADO.NET

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. WEB中运用ADO.NET • 利用ADO.NET存储和检索数据 • ADO.NET如何引用对象 • 添加、更改和删除行[基于设计模式下] • 在运行时创建数据库连接 • 在列表控件中显示数据 • 在数据库上执行命令 • 处理事务

  2. 利用ADO.NET存储和检索数据 • 利用ADO.NET存储和检索数据 • ADO.NET如何引用对象 • 在设计模式下创建连接、适配器和数据集对象时 ,会为这些对象启用数据类型化,这时我们可以 使用数据库架构中的专有名称来标识表、行和域 。但在运行时,创建对象,我们就需要使用非类 型化引用。

  3. // 对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);

  4. 要更改\删除数据集中的一行时,可以使用 FindBy方法从表中获取一个Row对象,然后在行 中进行更改\删除 更改 //声明一个行对象 DataSet1.ContactsRow rowChange; //使用主键获取要更改的行 rowChange = DataSet1.Contacts.FindByContactID(42); //更改行中的字段 rowChange.WorkPhone = "(555) 555-9000"; //删除行 rowDelete.Delete();

  5. 从DataSet更新Database • 在处理完页面上所有的控件事件后,通常都会执 行更新操作。通常在Page_PreRender事件中调用 Update方法。 private void Page_PreRender() { // 利用在DataSet对象中做的更改来更新数据库 sqlDataAdapter1.Update(DataSet1); //刷新DataGrid DataGrid1.DataBind(); }

  6. 当我们从数据集中更新数据库,ADO.NET按照以下当我们从数据集中更新数据库,ADO.NET按照以下 • 步骤进行: • 1、该数据集检查每一个DataRow对象的RowState • 属性来确定对该数据集的更改。可能的属性值为 • :Added\Deleted\Modified\Unchanged\Detached • 2、调用适配器对象的 • InsertCommand\DeletCommand\UpdateCommand属 • 性来完成数据库中做所需的更改。 • 3、将更新后的DataRow对象的RowState属性重新 设为Unchanged。[见示例:ADO\WebForm1]

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

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

  9. 更新运行时的数据库连接 • 1、设置适配器对象的SelectCommand。使用其 • CommandText属性为 • InsertCommand\DeleteCommand\UpdateCommand • 属性产生设置。 2、为适配器对象创建命令生成器对象 以下代码连接到一个数据库,创建一个数据集,产 生命令,修改数据集,然后根据更改记录来更新数 据库。 [见示例:ADO\CodeModeSql]

  10. // (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对象 • Page对象控制应用程序的用户界面。提供 了WEB编程时最常用的核心属性和方法。

  11. 在列表控件中显示数据 • [ListBox\DropDownList\CheckBoxList\RadioBut tonList]中显示数据集中项,有以下步骤: • 1、将控件的DataSource属性设置为数据集的名称 • 2、将控件的DataText属性设置为数据集成员, • 将其作为列表项的Text属性显示 • 3、将控件的DataValue属性设置为该数据集成员 • ,将其作为列表项的Value属性返回 • 4、在代码中,通过数据适配器填充该数据集并将 它绑定到该控件。

  12. 以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); }}}

  13. 选择特定记录,显示内容 • 示例[DataSet\ViewDataSet] private void drpContacts_SelectedIndexChanged() { adptCalls.SelectCommand.CommandText = “select * from calls where ContactID = ” + drpContacts.SelectedItem.Value; dsCalls.Clear(); adptCalls.Fill(dsCalls); grdCalls.DataBind(); }

  14. 在数据库上执行命令 • 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); // 关闭连接

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

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

  17. 2、一致性 在一个数据库 所有数据之间的关系 • 都得到正确的维护。例如:如果客户信息根据省 • 的税表使用税率,为该客户输入的省必须存在于 • 这个税表中。 • 3、隔离性 其他客户所做的更改不能影响当前的 • 更改。 • 4、持久性 一旦做了更改,就是持久的。如果在 一组命令完成之前出现系统错误或电源问题,这 些命令就会被撤消,而系统重新运行时,数据将 恢复到其原来的状态。

  18. 事务处理对于使用数据访问的WEB应用程序而言特别事务处理对于使用数据访问的WEB应用程序而言特别 重要,因为WEB应用程序是分布到很多不同的客户端 的。在一个WEB应用程序中,数据库是共享的资源, 分布在广大地区的大量不同客户中将出现这些关键 问题: • 1、争夺资源 2、意外失败 Internet并不是最可靠的网络环境, 即使你的WEB应用程序和WEB服务器是100%可靠的。 客户可能因为他们的服务提供程序、电源、网络等 问题而断开连接 • 因为变量名错误,我们将不能获取所需数据。这 容易查找,但如果发生在更深的结构中,问题就 难发现了。

  19. WEB应用程序生存期 WEB应用程序的生存期只存在 一个实例持续的时间,而且客户可以简单地在浏览 器中输入新地址而随时离开你的应用程序。 事务处理的一般步骤: • 1、开始一项事务 • 2、处理数据库命令 • 3、检查错误 4、如果错误发生,将数据库恢复到它在事务开始 时的状态;否则,就提交。

  20. 数据集事务 • 数据集通过RejectChanges和Update方法提供事务 处理。AcceptChanges方法,将数据集中的记录状 态重置为未更改。 Private void Page_Load() {if(!IsPostBack) {adpt.Fill(dataset); Seesion[“DS”] = dataset; } else {dataset = (dataset)Session[“DS”];} dataGrid.DataBind(); }

  21. 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(); } }

  22. ASP.NET应用 恢复: //将该数据集恢复到以前的状态 dataset.RejectChanges(); //刷新 grdContact.DataBind(); 更新 int intRows; intRows = adpt.Update(dataset); //将更改保存到状态变量中 Session[“DS”] = dataset; • AcceptChanes方法阻止Update方法在数据库中完成更改,因为Update使用行的DataRowState属性来确定要在数据库中修改的行。而AcceptChanes的执行,使行的DataRowState属性改为了Unchanged。

  23. 数据库事务 • 要使用任何一种事务对象,按以下步骤: • 1、打开一个数据库连接 • 2、使用数据库连接对象的BeginTransaction方法创建事务对象 • 3、创建命令对象来跟踪该事务,将每个命令对象的Transaction属性设置为2中的事务名称 • 4、执行命令 • 5、根据命令执行情况,提交或回滚事务 6、关闭数据库连接

  24. 示例:使用DataGrid显示来自Contacts数据库的联系示例:使用DataGrid显示来自Contacts数据库的联系 列表。DataGrid包含了一列按钮。允许用户删除联系 项。DeleteContact使用一个事务来确保如果联系项 被删除时该联系项的通话也被删除。 • 事务对象通过IsolationLevel属性确定如何处理当前 对数据库的更改。 示例 [Transaction]

  25. 隔离级别 行为 ReadUncommitted 不锁定正在读取的记录。 Choas 和ReadUncommitted一样的行为方式,但是要在进行写操作时检查其他挂起事务的隔离级别 ReadCommitted 锁定正在读取的记录,并在记录被读取后立即解除锁定。但不会防止记录被事务处理期间的其他客户添加、删除或更改 ReapeatableRead 锁定正在读取的记录,并将锁定保持到事务处理完成为止。 Serializable 锁定整个被读取的数据集,并将锁定保持到事务处理完成为止。这保证了数据和它在数据库中的顺序在事务处理期间不会变化。

More Related