250 likes | 465 Views
WEB 中运用 ADO.NET. 利用 ADO.NET 存储和检索数据 ADO.NET 如何引用对象 添加、更改和删除行[基于设计模式下] 在运行时创建数据库连接 在列表控件中显示数据 在数据库上执行命令 处理事务. 利用 ADO . NET 存储和检索数据. 利用 ADO . NET 存储和检索数据 ADO.NET 如何引用对象 在设计模式下创建连接、适配器和数据集对象时 ,会为这些对象启用数据类型化,这时我们可以 使用数据库架构中的专有名称来标识表、行和域 。但在运行时,创建对象,我们就需要使用非类 型化引用。.
E N D
WEB中运用ADO.NET • 利用ADO.NET存储和检索数据 • ADO.NET如何引用对象 • 添加、更改和删除行[基于设计模式下] • 在运行时创建数据库连接 • 在列表控件中显示数据 • 在数据库上执行命令 • 处理事务
利用ADO.NET存储和检索数据 • 利用ADO.NET存储和检索数据 • ADO.NET如何引用对象 • 在设计模式下创建连接、适配器和数据集对象时 ,会为这些对象启用数据类型化,这时我们可以 使用数据库架构中的专有名称来标识表、行和域 。但在运行时,创建对象,我们就需要使用非类 型化引用。
// 对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);
要更改\删除数据集中的一行时,可以使用 FindBy方法从表中获取一个Row对象,然后在行 中进行更改\删除 更改 //声明一个行对象 DataSet1.ContactsRow rowChange; //使用主键获取要更改的行 rowChange = DataSet1.Contacts.FindByContactID(42); //更改行中的字段 rowChange.WorkPhone = "(555) 555-9000"; //删除行 rowDelete.Delete();
从DataSet更新Database • 在处理完页面上所有的控件事件后,通常都会执 行更新操作。通常在Page_PreRender事件中调用 Update方法。 private void Page_PreRender() { // 利用在DataSet对象中做的更改来更新数据库 sqlDataAdapter1.Update(DataSet1); //刷新DataGrid DataGrid1.DataBind(); }
当我们从数据集中更新数据库,ADO.NET按照以下当我们从数据集中更新数据库,ADO.NET按照以下 • 步骤进行: • 1、该数据集检查每一个DataRow对象的RowState • 属性来确定对该数据集的更改。可能的属性值为 • :Added\Deleted\Modified\Unchanged\Detached • 2、调用适配器对象的 • InsertCommand\DeletCommand\UpdateCommand属 • 性来完成数据库中做所需的更改。 • 3、将更新后的DataRow对象的RowState属性重新 设为Unchanged。[见示例:ADO\WebForm1]
在运行时创建数据库连接 • 1、创建连接对象 • 2、创建数据适配器对象 • 3、创建数据集对象 • 4、在适配器对象上调用方法来填充或更新数据 • 集 • 5、使用数据绑定或其他技术显示来自该数据集 的数据 。
//创建数据连接 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();
更新运行时的数据库连接 • 1、设置适配器对象的SelectCommand。使用其 • CommandText属性为 • InsertCommand\DeleteCommand\UpdateCommand • 属性产生设置。 2、为适配器对象创建命令生成器对象 以下代码连接到一个数据库,创建一个数据集,产 生命令,修改数据集,然后根据更改记录来更新数 据库。 [见示例:ADO\CodeModeSql]
// (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编程时最常用的核心属性和方法。
在列表控件中显示数据 • [ListBox\DropDownList\CheckBoxList\RadioBut tonList]中显示数据集中项,有以下步骤: • 1、将控件的DataSource属性设置为数据集的名称 • 2、将控件的DataText属性设置为数据集成员, • 将其作为列表项的Text属性显示 • 3、将控件的DataValue属性设置为该数据集成员 • ,将其作为列表项的Value属性返回 • 4、在代码中,通过数据适配器填充该数据集并将 它绑定到该控件。
以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); }}}
选择特定记录,显示内容 • 示例[DataSet\ViewDataSet] private void drpContacts_SelectedIndexChanged() { adptCalls.SelectCommand.CommandText = “select * from calls where ContactID = ” + drpContacts.SelectedItem.Value; dsCalls.Clear(); adptCalls.Fill(dsCalls); grdCalls.DataBind(); }
在数据库上执行命令 • 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); // 关闭连接
删除 //创建命令对象//打开连接 //执行命令 ExecuteNonQuery(); //关闭连接 查询 //创建命令对象//打开连接 //创建数据阅读器对象 SqlDataReader readCalls //执行命令 ExecuteReader(); //显示数据 while(readCalls.Read()) {} //关闭阅读器//关闭连接
示例 [DataSet\SqlCommands\oleCommands] • 处理事务 • 理解事务 • 事务是一组被看作一个单元的数据库命令。 • 如果命令有以下特点,它们就可以属于一个事务 • 1、原子性 它们组成一个工作单位。例如,如 • 果一个客户搬家了,你想要数据条目运算符将所 • 有的客户地址字段作为一个单元进行更改,而不 • 是先更改街道,然后更改城市等。
2、一致性 在一个数据库 所有数据之间的关系 • 都得到正确的维护。例如:如果客户信息根据省 • 的税表使用税率,为该客户输入的省必须存在于 • 这个税表中。 • 3、隔离性 其他客户所做的更改不能影响当前的 • 更改。 • 4、持久性 一旦做了更改,就是持久的。如果在 一组命令完成之前出现系统错误或电源问题,这 些命令就会被撤消,而系统重新运行时,数据将 恢复到其原来的状态。
事务处理对于使用数据访问的WEB应用程序而言特别事务处理对于使用数据访问的WEB应用程序而言特别 重要,因为WEB应用程序是分布到很多不同的客户端 的。在一个WEB应用程序中,数据库是共享的资源, 分布在广大地区的大量不同客户中将出现这些关键 问题: • 1、争夺资源 2、意外失败 Internet并不是最可靠的网络环境, 即使你的WEB应用程序和WEB服务器是100%可靠的。 客户可能因为他们的服务提供程序、电源、网络等 问题而断开连接 • 因为变量名错误,我们将不能获取所需数据。这 容易查找,但如果发生在更深的结构中,问题就 难发现了。
WEB应用程序生存期 WEB应用程序的生存期只存在 一个实例持续的时间,而且客户可以简单地在浏览 器中输入新地址而随时离开你的应用程序。 事务处理的一般步骤: • 1、开始一项事务 • 2、处理数据库命令 • 3、检查错误 4、如果错误发生,将数据库恢复到它在事务开始 时的状态;否则,就提交。
数据集事务 • 数据集通过RejectChanges和Update方法提供事务 处理。AcceptChanges方法,将数据集中的记录状 态重置为未更改。 Private void Page_Load() {if(!IsPostBack) {adpt.Fill(dataset); Seesion[“DS”] = dataset; } else {dataset = (dataset)Session[“DS”];} dataGrid.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(); } }
ASP.NET应用 恢复: //将该数据集恢复到以前的状态 dataset.RejectChanges(); //刷新 grdContact.DataBind(); 更新 int intRows; intRows = adpt.Update(dataset); //将更改保存到状态变量中 Session[“DS”] = dataset; • AcceptChanes方法阻止Update方法在数据库中完成更改,因为Update使用行的DataRowState属性来确定要在数据库中修改的行。而AcceptChanes的执行,使行的DataRowState属性改为了Unchanged。
数据库事务 • 要使用任何一种事务对象,按以下步骤: • 1、打开一个数据库连接 • 2、使用数据库连接对象的BeginTransaction方法创建事务对象 • 3、创建命令对象来跟踪该事务,将每个命令对象的Transaction属性设置为2中的事务名称 • 4、执行命令 • 5、根据命令执行情况,提交或回滚事务 6、关闭数据库连接
示例:使用DataGrid显示来自Contacts数据库的联系示例:使用DataGrid显示来自Contacts数据库的联系 列表。DataGrid包含了一列按钮。允许用户删除联系 项。DeleteContact使用一个事务来确保如果联系项 被删除时该联系项的通话也被删除。 • 事务对象通过IsolationLevel属性确定如何处理当前 对数据库的更改。 示例 [Transaction]
隔离级别 行为 ReadUncommitted 不锁定正在读取的记录。 Choas 和ReadUncommitted一样的行为方式,但是要在进行写操作时检查其他挂起事务的隔离级别 ReadCommitted 锁定正在读取的记录,并在记录被读取后立即解除锁定。但不会防止记录被事务处理期间的其他客户添加、删除或更改 ReapeatableRead 锁定正在读取的记录,并将锁定保持到事务处理完成为止。 Serializable 锁定整个被读取的数据集,并将锁定保持到事务处理完成为止。这保证了数据和它在数据库中的顺序在事务处理期间不会变化。