项目四Web应用开发中的数据访问.ppt
项目四 Web应用开发中的数据访问,任务1 用户注册功能的实现任务2 在线购物时商品管理功能的实现任务3 购物车的实现任务4 留言板的功能实现,任务1 用户注册功能的实现,任务场景:,几乎所有的Web系统中,都需要实现用户注册功能,即有一个注册页面。项目2的任务1完成了用户注册的页面设计和数据验证。本任务使用ASP.NET 3.5提供了ADO.NET数据访问技术,轻松地实现应用程序连接数据库,并将用户注册的信息保存到数据库中。,知识要点,数据访问模型数据访问原理ADO.NET访问技术使用Connection对象连接数据库编写代码创建数据库连接使用Web.Config文件定义数据连接字符串使用Command对象操作数据库Command对象使用Command对象操作数据使用DataReader对象读取数据SqlDataReader对象的属性和方法使用SqlDataReader对象,4.1 数据访问模型,数据访问原理ADO.NET访问技术,数据访问原理,通过对ADO.NET的引用,达到了获取数据和操作数据的目的。数据访问涉及四个主要的组件:Web应用程序(ASP.NET)、数据层(ADO.NET)、数据提供程序以及数据源。,数据访问原理,数据存储(Data Store)数据存放的源头,包括关系数据库、XML文件、Web服务、平面文件或诸如Microsoft Excel电子数据表程序中的数据。数据提供程序(Provider)ASP.NET提供不同数据源的提供程序,开发人员只需编写一组数据访问代码就能访问各种类型的数据。数据操作层(DataLayer)通过ADO.NET API定义的抽象层,不论何种数据源,提取信息的过程都具有相同的关键类和步骤。Web应用程序层一系列数据控件,ADO.NET访问技术,一种将Microsoft.NET的Web应用程序以及Microsoft Windows应用程序连接到诸如SQL Server数据库或XML文件等数据源的技术。专门为Internet无连接的工作环境而设计,它提供了一种简单而灵活的方法,便于开发人员把数据访问和数据处理集成到Web应用程序中。,ADO.NET访问技术,ADO.NET组成ADO.NET包括两个核心组件:.NET Framework数据提供程序和DataSet数据集。数据提供程序数据提供程序用于连接到数据库、执行命令和检索结果。数据提供程序中包含的核心对象,ADO.NET访问技术,ADO.NET组成.NET Framework提供了4个数据提供程序:SQL Server.NET Framework数据提供程序OLE DB.NET Framework数据提供程序ODBC.NET Framework数据提供程序Oracle.NET Framework数据提供程序,ADO.NET访问技术,ADO.NET组成DataSet对象用于存储从数据源中收集的数据。处理存储在DataSet中的数据并不需要ASP.NETWeb窗体与数据源保持连接,仅当数据源中的数据随着改变而被更新的时候,才会重新建立连接。与DataSet相关的对象,ADO.NET访问技术,使用ADO.NET访问数据ADO.NET提供了一组丰富的对象,用于对任何种类的数据存储的连接式或断开式访问。在连接式访问模式下,连接会在程序的整个生存周期中保持打开,而不需要对状态进行特殊处理。断开方式的处理模式可以为应用程序提供良好的性能和伸缩性。,使用ADO.NET访问数据,断开式数据访问模式,断开式数据访问模式指的是客户端不直接对数据库进行操作。使用断开式数据访问模式的基本过程使用连接对象Connection连接并打开数据库。使用数据适配器DataAdapter对象填充数据集DataSet。关闭连接。对DataSet进行更新操作,操作完成后打开连接。使用数据适配器DataAdapter更新数据库,关闭连接。断开式数据访问模式适用于远程数据处理、本地缓存数据及执行大量数据的处理,而不需要与数据源保持连接的情况。,连接式数据访问模式,指用户在操作过程中,一直与数据库保持连接。一般使用命令对象Command进行数据库相关操作,并使用DataReader对象以只读方式返回数据并显示,从而提高应用程序的性能。在实际应用中,选择数据访问模式的基本原则是首先满足需求,然后考虑性能优化。,4.2 使用Connection对象连接数据库,访问数据库的第一项工作就是和数据库建立连接,然后通过该连接向数据库发送命令并读取返回的数据,这些在ADO.NET中由Connection对象来实现。编写代码创建数据库连接使用Web.Config文件定义数据连接字符串,编写代码创建数据库连接,使用SQL Server.NET数据提供程序连接SQL Server 2005数据库SQL Server.NET数据提供程序提供的相关类在命名空间下需要使用SqlConnection对象来连接数据库通过设置SqlConnection对象的ConnectionString属性将建立连接的详细信息传递给SqlConnection对象,ConnectionString中常见的属性,ConnectionString中常见的属性,连接字符串,连接字符串可以在创建SqlConnection对象时作为参数传递,也可以通过ConnectionString属性来设置。创建网站到本机上的SQLServer连接SqlConnection sqlconn=new SqlConnection(Server=(local);Database=SuperMarketDB;Integrated Security=SSPI;“);创建网站到远程服务器MyServer的连接并设置连接超时时间为60秒。SqlConnection sqlconn2=new SqlConnection(Userid=aa;Passord=abcd;Server=MyServer;Database=SuperMarketDB;Connection Timeout=60;);,SqlConnection对象的主要方法,编写代码创建数据库连接,使用OLEDB.NET数据提供程序连接Access数据库访问Access数据库,需要SQL OLEDB.NET数据提供程序。SQL OLEDB.NET数据提供程序,提供相关类在命名空间下,需要OleDBConnection对象来连接数据库。OleDBConnection和SqlConnection的使用基本是一样的,唯一的区别就是ConnectionString的取值有所不同,编写代码创建数据库连接,使用OLEDB.NET数据提供程序连接Access数据库访问Access数据库StudentMS.mdb的示例OleDbConnection oledbconn;oledbconn.ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=f:SuperMarketDB.mdb;oledbconn.Open();oledbconn.Close();,使用Web.Config文件定义数据连接字符串,将连接字符串保存在Web.config文件中OleDbConnection oledbconn;oledbconn.ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0;DataSource=f:SuperMarketDB.mdb;oledbconn.Open();oledbconn.Close();在窗体中创建连接对象读取连接字符串string myconnstr=ConfigurationManager.ConnectionStringsDBConnStr.ConnectionString;SqlConnection sqlconn=new SqlConnection(myconnstr);sqlconn.Open();,4.3 使用Command对象操作数据库,Command对象SqlCommand对象的属性SqlCommand对象的方法使用Command对象操作数据使用Command对象操作数据在操作数据时使用SQL参数,SqlCommand对象的属性,SqlCommand对象的属性,指定T-SQL命令作为SqlCommand对象的文本SqlCommand cmd;cmd.Connection=sqlconn;cmd.CommandType=CommandType.Text;cmd.CommandText=Select*from T_Ware;使用StordProcedure命令类型调用存储过程。SqlCommand cmd;cmd.Connection=sqlconn;cmd.CommandType=CommandType.StoredProcedure;cmd.CommandText=GetAllWares;,SqlCommand对象的方法,SqlCommand对象的方法,SqlCommand提供了3种不同的方法在SQL Server上执行T-SQL语句,这3种方法的工作方式非常相似。每种方法都会将在SqlCommand对象中形成的命令详细信息,传递给指定的连接对象,再通过SqlConnection对象在SQL Server上执行T-SQL语句,最后根据语句执行结果生成一组数据,SqlCommand对象的方法,ExecuteNonQuery返回受T-SQL语句影响的行数适合执行不返回结果集的T-SQL命令。数据定义语句(DDL)命令,如Create Table、Create View、Drop Table;数据操作语言(DML)命令,如Insert、Update和Delete;不返回结果集的存储过程。,SqlCommand对象的方法,ExecuteNonQuerystring myconnstr=ConfigurationManager.ConnectionStringsDBConnStr.ConnectionString;SqlConnection sqlconn=new SqlConnection(myconnstr);SqlCommand cmd;cmd.Connection=sqlconn;cmd.CommandType=CommandType.Text;sqlconn.Open();,SqlCommand对象的方法,ExecuteNonQuerycmd.CommandText=Create Table TempTable(IDCol Int);cmd.ExecuteNonQuery();cmd.CommandText=Insert TempTable(IDCol)Values(1);cmd.ExecuteNonQuery();cmd.CommandText=Drop Table TempTable;cmd.ExecuteNonQuery();sqlconn.Close();,SqlCommand对象的方法,ExecuteReader返回DataReader对象String str=“select SPMC from T_SPXX”;SqlCommand scmd=new SqlCommand(str,sqlconn);SqlDataReader sdr=scmd.ExecuterReader();while(sdr.Read()Label1.Text=sdr“SPMC”.ToString()+”;,SqlCommand对象的方法,ExecuteScalar返回一个单值.多用于使用聚合函数的情况,例如COUNT(*)之类的聚合函数。String str=select count(*)from T_SPXX;SqlCommand scmd=new SqlCommand(str,conn);int count=Convert.toInt32(scmd.ExecuteScalar();,使用Command对象操作数据,使用Command对象实现数据库的操作是典型的ADO.NET连接式操作模式。其基本步骤包括:打开到数据库连接。创建新的Command对象。定义T-SQL命令。执行T-SQL命令。关闭数据库连接。,使用Command对象操作数据,获取用户在文本框中输入的姓名、性别、职务、公司和联系方式等信息,并将获取的信息插入到数据库中。string strName=TextBox1.Text;string strSex=TextBox2.Text;string strPost=TextBox3.Text;string strCompany=TextBox4.Text;string strContact=TextBox5.Text;string connstr=ConfigurationManager.ConnectionStringsConnStr.ConnectionString;,使用Command对象操作数据,SqlConnection conn=new SqlConnection(connstr);conn.Open();string SQLStr=insert into T_Ware values(+strName+,+strSex+,+strPost+,+strCompany+,+strContact+);SqlCommand cmd=new SqlCommand(SQLStr,conn);cmd.ExecuteNonQuery();conn.Close();,在操作数据时使用SQL参数,在实际应用中,常常需要用户在页面上输入信息,并将这些信息插入到数据库中。只要允许用户输入数据,就有可能出现输入错误,并可能对Web应用程序创建和执行SQL代码产生致命的影响。为了解决这个问题,除了对输入控件进行检查之外,还可以在生成T-SQL命令时,不使用窗体变量而使用SQL参数来构造连接字符串。SQL参数不属于SQL查询的可执行脚本部分。由于错误或恶意的用户输入不会处理成可执行脚本,所以不会影响SQL查询的执行结果。,在操作数据时使用SQL参数,Parameters属性和SqlParameter对象要在ADO.NET对象模型中使用SQL参数,需要向Command对象的Parameters集合中添加Parameter对象。在使用SQL Server.NET数据提供程序时,要使用的Parameter对象的类名为SqlParameter。SqlParameter对象的属性,在操作数据时使用SQL参数,Parameters属性和SqlParameter对象使用SQL参数的基本步骤使用Parameters构建SqlCommand命令字符串。声明SqlParameter对象,并赋值。将SqlParameter对象赋值给SqlCommand对象的Parameters属性。string strName=TextBox1.Text;string strSex=TextBox2.Text;string strPost=TextBox3.Text;string strCompany=TextBox4.Text;string strContact=TextBox5.Text;string connstr=ConfigurationManager.ConnectionStrings“ConnStr”.ConnectionString;,在操作数据时使用SQL参数,SqlConnection conn=new SqlConnection(connstr);conn.Open();string SQLStr=insert into T_Ware values(strName,strSex,strPost,strCompany,strContact);SqlParameter paraName1=new SqlParameter(strName,strName);SqlParameter paraName2=new SqlParameter(strSex,strSex);SqlParameter paraName3=new SqlParameter(strPost,strPost);SqlParameter paraName4=new SqlParameter(strCompany,strCompany);SqlParameter paraName5=new SqlParameter(strContact,strContact);SqlCommand cmd=new SqlCommand(SQLStr,conn);,在操作数据时使用SQL参数,cmd.Parameters.Add(paraName1);cmd.Parameters.Add(paraName2);cmd.Parameters.Add(paraName3);cmd.Parameters.Add(paraName4);cmd.Parameters.Add(paraName5);cmd.ExecuteNonQuery();conn.Close();,4.4 使用DataReader对象读取数据,DataReader对象定义如何根据连接读取数据。DataReader对象的特点主要有:DataReader只能读取数据,不能对记录进行数据的编辑、添加和删除。DataReader只能在记录间“向前”移动,一旦移动到“下一个”记录,就不能再回到前一个记录了,除非再执行一遍所有的SQL查询。DataReader不能在IIS内存中存储数据,数据直接在页面对象上显示。DataReader是工作在连接模式下的,应用程序在读取数据时,数据库的连接必须处于打开状态。,SqlDataReader对象的属性,SqlDataReader对象的方法,SqlDataReader对象的方法,使用SqlDataReader对象,获取某一表中的字段名,string SQLStr=select*from T_Ware;SqlCommand cmd=new SqlCommand(SQLStr,conn);SqlDataReader dr=cmd.ExecuteReader();/检索列架构信息(列的字段属性)DataTable scm=dr.GetSchemaTable();foreach(DataRow myRow in scm.Rows)Message.Text=myRow0.ToString()+;,使用SqlDataReader对象,获取某一记录的字段值,string SQLStr=select*from student where id=2;SqlCommand cmd=new SqlCommand(SQLStr,conn);SqlDataReader dr=cmd.ExecuteReader();if(dr.Read()txtName.Text=drName.ToString();txtPassord1.Text=drPassword.ToString();txtAge.Text=drAge.ToString();,任务实施,在线购物时商品管理功能的实现,任务实施,步骤1还原数据库备份。步骤2新建一个网站,添加Web窗体。步骤3添加用户输入的控件。步骤4为输入控件添加验证。,任务实施,步骤5配置数据库连接字符串。,任务实施,步骤6实现将用户注册信息保存到数据库,并提示注册成功的功能。,protected void btnOK_Click(object sender,EventArgs e)if(Page.IsValid)string username=txtUsername.Text;string password=txtPwd.Text;string truename=txtName.Text;string sex=radioSex.SelectedValue;int age=Convert.ToInt16(txtAge.Text);string email=txtEmail.Text;string qq=txtQQ.Text;string connstr=ConfigurationManager.ConnectionStringsSMDBConnStr.ConnectionString;SqlConnection conn=new SqlConnection(connstr);conn.Open();,任务实施,string sqlstr=insert into t_Vip(hy_Username,hy_passwod,hy_name,hy_sex,hy_age,hy_email,hy_qq)values(hy_Username,hy_passwod,hy_name,hy_sex,hy_age,hy_email,hy_qq);SqlParameter prams=new SqlParameter(hy_Username,username),new SqlParameter(hy_passwod,password),new SqlParameter(hy_name,truename),new SqlParameter(hy_sex,sex),new SqlParameter(hy_age,DbType.Int16),new SqlParameter(hy_email,email),new SqlParameter(hy_qq,qq);SqlCommand cmd=new SqlCommand(sqlstr,conn);if(prams!=null)foreach(SqlParameter para in prams)cmd.Parameters.Add(para);cmd.ExecuteNonQuery();Response.Write(alert(注册成功);,任务实施,步骤7浏览“Register.aspx”页面,查看效果。,任务2 在线购物时商品管理功能的实现,任务场景:,对于像“淘宝”、“阿里巴巴”之类的购物网站,不仅买家能方便地查找自己喜欢的商品,而且卖家还能管理自己的商品,如对商品进行添加、删除和修改等操作。本任务通过使用数据源控件SqlDataSource、数据绑定控件GridView和FormView控件,结合DataSet对象和DataAdapter对象,来实现商品管理的各项功能。,知识要点,SqlDataSource控件GridView控件DataSet对象和DataAdapter对象FormView控件数据绑定,4.5 SqlDataSource控件,SqlDataSource控件概述在SqlDataSource中使用参数化查询数据绑定控件,4.5.1 SqlDataSource控件概述,一个数据源控件代表数据在系统内存中的映像,并能够在Web页面上通过数据绑定控件展示出来。ASP.NET 3.5提供了SqlDataSource、AccessDataSource、ObjectDataSource、XmlDataSource和SiteMapDataSource 5个内置数据源控件。SqlDataSource可用于任何具有关联ADO.NET提供程序的数据库,包括Microsoft SQL Server、OLE DB、ODBC或Oracle数据库。,SqlDataSource控件实现数据访问,例4-1:查询商品类型表T_WareType中商品类别的名称,并将查询结果置于下拉列表控件DropDownList1中新建Web窗体,添加SqlDataSource控件。,SqlDataSource控件实现数据访问,配置数据源,SqlDataSource控件实现数据访问,配置数据源,SqlDataSource控件实现数据访问,将连接字符串保存到配置文件Web.Config中,SqlDataSource控件实现数据访问,配置SqlDataSource1数据源控件关联的SQL语句,SqlDataSource控件实现数据访问,在页面中,添加一个DropDownList控件,单击该控件右边的“智能标记”按钮,选择“选择数据源”命令。,SqlDataSource控件的属性,ConnectionString设置特定数据库的连接字符串。为使Web应用程序更易于维护并且安全性更高,通常将连接字符串存储在应用程序配置文件的connectionStrings元素中。SelectCommand指定该控件要执行的SQL查询。,4.5.2 在SqlDataSource中使用参数化查询,用户在文本框中输入要查询的商品名称的部分文字,单击“查询”按钮,在商品表(T_Ware)中查找符合条件的商品信息,并将查询结果呈现在GridView控件中。新建Web窗体,添加一个TestBox控件;添加一个查询按钮。,4.5.2 在SqlDataSource中使用参数化查询,添加SqlDataSource控件,配置数据源。,4.5.2 在SqlDataSource中使用参数化查询,单击“WHERE”按钮,弹出“添加WHETE子句”对话框。,4.5.2 在SqlDataSource中使用参数化查询,添加了参数之后,单击“确定”按钮以返回“配置数据源”向导。,SELECT sp_WareID,sp_WareNameFROM T_WareWHERE sp_WareName like%+sp_WareName+%,4.5.2 在SqlDataSource中使用参数化查询,完成SqlDataSource的配置,查看其声明标记代码。,SelectCommand=SELECT sp_WareID,sp_WareName FROM T_Ware WHERE(sp_WareName LIKE%+sp_WareName+%),4.5.3 数据绑定控件,常用的数据绑定控件DropDownListListBoxGridViewDataListFormViewRepeater常用属性和方法DataSource属性DataSourceID属性DataBind方法,4.6 GridView控件,GridView控件概述自定义列分页,4.6.1 GridView控件概述,GridView控件以表格的形式显示数据源的值,每列表示一个字段,每行表示一条记录。该控件提供了内置排序功能、内置更新和删除功能、内置分页功能、内置行选择功能、以编程方式访问GridView对象模型以动态设置属性以及处理事件等功能。可以通过主题和样式进行自定义外观,实现多种样式的数据展示。,GridView控件常见属性,4.6.2 自定义列,GridView中列的类型,GridView中列的类型,绑定列用于显示数据源中一列的信息。,GridView中列的类型,复选框列用于显示布尔型数据字段的值。超链接列用于显示各行中的链接。,GridView中列的类型,图像列可以为所显示的每行记录显示图像。按钮列可以创建“编辑”、“更新”、“取消”和“删除”功能的按钮。,GridView中列的类型,模板列新增模板列对模板列进行编辑和设计,GridView控件中的模板类型,模板列举例,例4-3:使用GridView控件显示商品记录列表,在GridView中添加一个模板列,用来显示商品类别的名称,模板列举例,界面文件中绑定列和模板列的代码,模板列举例,SelectCommand=SELECT sp_WareID,sp_WareName,sp_Price,splb_TypeID,sp_Checked FROM T_Ware,模板列举例,对GridView控件的RowDataBound事件编写代码,在模板列上显示商品类别。,protected void GridView1_RowDataBound(object sender,GridViewRowEventArgs e)if(=DataControlRowType.DataRow)/获取每一行的商品类别的IDint typeID;typeID=Convert.ToInt32(DataBinder.Eval(e.Row.DataItem,splb_TypeID);/获取某商品类别ID的名称string str=TypeName(typeID);/在GridView的行中查找名为“Label1”的控件Label lbl=(Label)e.Row.FindControl(Label1);lbl.Text=str;,模板列举例,使用TypeName方法读出指定商品类别编号所对应的商品名称。,protected string TypeName(int typeID)string s=;string str=select splb_TypeName from T_WareType where splb_typeid=+typeID;SqlConnection string strconn=ConfigurationManager.ConnectionStringsSMDBConnStr.ConnectionString;conn=new SqlConnection(strconn);conn.Open();SqlCommand cmd=new SqlCommand(str,conn);SqlDataReader sdr=cmd.ExecuteReader();if(sdr.Read()s=sdrsplb_TypeName.ToString();conn.Close();return s;,4.6.3 分页,界面方式实现分页通过编程方式实现分页AllowPaging属性设置为TruePageSize属性设置页的大小PageIndex属性设置GridView控件的当前页PagerSettings属性进行分页的UI设计,,4.7 DataSet对象和DataAdapter对象,DataSet对象DataAdapter对象填充数据集使用DataSet对数据源中的记录进行编辑,4.7.1 DataSet对象,DataSet对象即数据集对象,采用断开连接数据访问模式。DataSet对象是数据的一种内存驻留表示形式,无论包含的数据来自什么数据源,它都会提供一致的关系编程模型。DataSet对象把数据存储在一个或多个DataTable中,每一个DataTable又包含了DataRow和DataColumn。XML文档可以导入DataSet对象,而DataSet对象中的数据也可以导出为XML文档。,DataSet类相关联的主要类,4.7.2 DataAdapter对象,DataAdapter对象是DataSet和ADO.NET对象模型中断开式连接对象之间的桥梁。该对象使用Connection对象与数据库连接,然后使用Command和DataReader对象来获取数据和处理数据库的变化。DataAdapter对象的属性包含SQL语句的SqlCommand或OleDbCommand对象,有4种Command-Type属性SelectCommand:该属性发布一个SQL Select语句。UpdateCommand:该属性发布一个SQL Update语句。InsertCommand:该属性发布一个SQL Insert语句。DeleteCommand:该属性发布一个SQL Delete语句。,4.7.3 填充数据集,DataAdapter填充DataSet的过程主要分为两个步骤:通过DataAdapter的SelectCommand属性从数据库中检索出所需数据。调用DataAdapter的Fill方法把检索出的数据填充到DataSet。填充数据集的代码,string connstr=ConfigurationManager.ConnectionStringsSMDBConnStr.ConnectionString;SqlConnection sqlConn=new SqlConnection(connstr);sqlConn.Open();string str=SELECT*FROM T_WareTypeSqlDataAdapter da=new SqlDataAdapter(str,sqlConn);DataSet ds=new DataSet();da.Fill(ds,splb);,4.7.4 使用DataSet对数据源中的记录进行编辑,添加记录更新记录,DataTable dt=ds.Tablessplb;DataRow row=dt.NewRow();rowsplb_TypeName=TextBox1.Text;dt.Rows.Add(row);da.Update(ds,splb);,string str=SELECT*FROM T_WareType where splb_TypeID=+spID;DataTable dt=ds.Tablessplb;DataRow row=dt.Rows0;rowsplb_TypeName=TextBox1.Text;da.Update(ds,splb);,4.7.4 使用DataSet对数据源中的记录进行编辑,删除记录,string str=SELECT*FROM T_WareType where splb_TypeID=+spID;DataTable dt=ds.Tablessplb;DataRow row=dt.Rows0;row.Delete();da.Update(ds,splb);,4.8 FormView控件,FormView控件的功能可以绑定到数据源控件,如 SqlDataSource 和 ObjectDataSource。内置插入、更新和删除功能。内置分页功能。可以动态设置属性和处理事件。可通过用户定义的模板、主题和样式自定义外观。更新记录,FormView控件举例,sp_WareID:/sp_Information:/sp_Time:/sp_Price:/sp_WareName:/,FormView控件举例,sp_Information:/sp_Time:/sp_Price:/sp_WareName:/,FormView控件举例,sp_WareID:/sp_Information:/sp_Time:/sp_Price:/sp_WareName:/,FormView控件举例,DeleteCommand=DELETE FROM T_Ware WHERE sp_WareID=original_sp_WareID AND sp_Price=original_sp_Price AND sp_WareName=original_sp_WareNameAND sp_Information=original_sp_InformationInsertCommand=INSERT INTO T_Ware(sp_Price,sp_WareName,sp_Information)VALUES(sp_Price,sp_WareName,sp_Information)OldValuesParameterFormatString=original_0SelectCommand=SELECT sp_WareID,sp_Price,sp_WareName,sp_Information FROM T_WareUpdateCommand=UPDATE T_Ware SET sp_Price=sp_Price,sp_WareName=sp_WareName,sp_Information=sp_Information WHERE sp_WareID=original_sp_WareID AND sp_Price=original_sp_Price AND sp_WareName=original_sp_WareName AND sp_Information=original_sp_Information,FormView控件举例,任务实施,在线购物时商品管理功能的实现,任务实施,步骤1还原