asp.net3.5从知识学习进步基础学习知识入门基础到精通.doc

上传人:小** 文档编号:2541563 上传时间:2020-04-19 格式:DOC 页数:100 大小:2.87MB
返回 下载 相关 举报
asp.net3.5从知识学习进步基础学习知识入门基础到精通.doc_第1页
第1页 / 共100页
asp.net3.5从知识学习进步基础学习知识入门基础到精通.doc_第2页
第2页 / 共100页
点击查看更多>>
资源描述

《asp.net3.5从知识学习进步基础学习知识入门基础到精通.doc》由会员分享,可在线阅读,更多相关《asp.net3.5从知识学习进步基础学习知识入门基础到精通.doc(100页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第9章 ASP.NET操作数据库通过对ADO.NET的基本讲解,以及讲解了一些数据源控件的基本用法后,本章将介绍一些ASP.NET操作数据库的高级用法,包括使用SQLHelper,以及数据源控件对数据的操作。本章是对前面的数据库知识的一种补充和提升。9.1 使用ADO.NET操作数据库上一章中介绍了ADO.NET的基本概念、ADO.NET的对象,以及如何使用ADO.NET。使用ADO.NET能够极大的方便开发人员对数据库进行操作而无需关心数据库底层之间的运行,ADO.NET不仅包括多个对象,同样包括多种方法,这些方法都可以用来执行开发人员指定的SQL语句,但是这些方法实现过程又不尽相同,本节将

2、介绍ADO.NET中数据的操作方法。9.1.1 使用ExecuteReader()操作数据库使用ExecuteReader()操作数据库,ExecuteReader()方法返回的是一个SqlDataReader对象或OleDbDataReader对象。当使用DataReader对象时,不会像DataSet那样提供无连接的数据库副本,DataReader类被设计为产生只读、只进的数据流。这些数据流都是从数据库返回的。所以,每次的访问或操作只有一个记录保存在服务器的内存中。相比与DataSet而言,DataReader具有较快的访问能力,并且能够使用较少的服务器资源。DataReader对象提供了

3、“游标”形式的读取方法,当从结果中读取了一行,则“游标”会继续读取到下一行。通过Read方法可以判断数据是否还有下一行,如果存在数据,则继续运行并返回true,否则返回false。示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str); con.Open();/打开连接 string strsql = select * from mynews;/SQL查询语句 SqlCommand cmd = new SqlCommand(s

4、trsql, con);/初始化Command对象 SqlDataReader rd = cmd.ExecuteReader();/初始化DataReader对象 while (rd.Read() Response.Write(rdtitle.ToString();/通过索引获取列 DataReader可以提高执行效率,有两种方式可以提高代码的性能,一种是基于序号的查询;第二种情况则是使用适当的Get方法来查询。一般来说,在数据库的设计中,需要设计索引键或主键来标识,在主键的设计中,自动增长类型是经常使用的,自动增长类型通常为整型,所以基于序号的查询可以使用DataReader,示例代码如下所

5、示。 string str = server=(local);database=mytable;uid=sa;pwd=sa;/设置连接字串 SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接 string strsql = select * from mynews where id=1 order by id desc;/按标识查询 SqlCommand cmd = new SqlCommand(strsql, con);/创建Command对象 SqlDataReader rd = cmd.ExecuteRe

6、ader();/创建DataReader对象 while (rd.Read()/遍历数据库 Response.Write(rdtitle.ToString();/读取相应行的信息 当使用ExecuteReader()操作数据库时,会遇到知道某列的名称而不知道某列的号的情况,这种情况可以通过使用DataReader对象的GetOrdinal()方法获取相应的列号。此方法接收一个列名并返回此列名所在的列号,示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con =

7、new SqlConnection(str);/创建连接对象 con.Open();/打开连接 string strsql = select * from mynews where id=1 order by id desc;/创建执行SQL语句 SqlCommand cmd = new SqlCommand(strsql, con);/创建Command对象 SqlDataReader rd = cmd.ExecuteReader();/创建DataReader对象 int id = rd.GetOrdinal(title);/使用GetOrdinal方法获取title列的列号 while

8、(rd.Read()/遍历DataReader对象 Label1.Text = 新闻id是 + rdid;/输出对象的值 当完成数据库操作时,需要关闭数据库连接,DataReader对象在调用Close()方法即关闭与数据库的连接,如果在没有关闭之前又打开另一个连接,系统会抛出异常。示例代码如下所示。 rd.Close();/关闭DataReader对象ExecuteReader()可以执行相应的SQL语句,例如插入、更新以及删除等,当需要执行插入、更新或删除时,可以使用ExecuteReader()进行数据操作,示例代码如下所示。 string str = server=(local);da

9、tabase=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接 string strsql = insert into mynews values (执行更新后的标题);/创建执行SQL语句 SqlCommand cmd = new SqlCommand(strsql, con);/创建Command对象 SqlDataReader rd = cmd.ExecuteReader();/使用ExcuteReader()方法 while (rd.Read

10、()/读取数据库 Response.Write(rdtitle.ToString() + ); rd.Close();/关闭DataReader对象 Response.Redirect(ExecuteReader.aspx);当执行了插入、删除等数据库操作时,ExecuteReader返回为空的DataReader对象。当使用Read方法遍历读取数据库时,并不会显示相应的数据信息,因为不是查询语句,则返回一个没有任何数据的System.Data.OleDb.OleDbDataReader类型的集(EOF),但是ExecuteReader方法可以执行SQL语句。如图9-1所示。图9-1 Exec

11、uteReader()执行查询和事务处理使用ExecuteReader()操作数据库,通常情况下是使用ExecuteReader()进行数据库查询操作,使用ExecuteReader()查询数据库能够提升查询效率,而如果需要进行数据库事务处理的话,ExecuteReader()方法并不是理想的选择。9.1.2 使用ExecuteNonQuery()操作数据库使用ExecuteNonQuery()操作数据库时,ExecuteNonQuery()并不返回DataReader对象,返回的是一个整型的值,代表执行某个SQL语句后,在数据库中影响的行数,示例代码如下所示。 string str = se

12、rver=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接 string strsql = select top 5 * from mynews order by id desc; SqlCommand cmd = new SqlCommand(strsql, con);/使用ExecuteNonQuery Label1.Text=该操作影响了+cmd.ExecuteNonQuery()+行;/执行SQL语句并返回行

13、上述代码使用了SELECT语句,并执行语句,返回受影响的行数。运行后,发现返回的结果为-1,说明,当使用SELECT语句时,并没有对任何行有任何影响。ExecuteNonQuery()通常情况下为数据库事务处理的首选,当需要执行插入、删除、更新等操作时,首选ExecuteNonQuery()。对于更新、插入和删除的SQL句,ExecuteNonQuery()方法的返回值为该命令所影响的行数。对于“CREATE TABLE”和“DROP TABLE”语句,返回值为0,而对于所有其他类型的语句,返回值为-1。ExecuteNonQuery()操作数据时,可以不使用DataSet直接更改数据库中的数

14、据,示例代码如下所示。 protected void Button1_Click(object sender, EventArgs e) string str = server=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接 string strsql = delete from mynews where id4;/编写执行删除的SQL语句 SqlCommand cmd = new SqlCommand(strsq

15、l, con);/创建Command对象 Label1.Text = 该操作影响了 + cmd.ExecuteNonQuery() + 行;/返回影响行数 运行上述代码后,会执行删除id号大于4的数据事务,当执行删除并删除完毕后,则ExecuteNonQuery()方法返回受影响的行数,如图9-2所示。图9-2 ExecuteNonQuery()方法ExecuteNonQuery()操作主要进行数据库操作,包括更新、插入和删除等操作,并返回相应的行数。在进行数据库事务处理时或不需要DataSet为数据库进行更新时,ExecuteNonQuery()方法是数据操作的首选。因为ExecuteNon

16、Query()支持多种数据库语句的执行。注意:有些项目中,通过判断ExecuteNonQuery()的返回值来判断SQL语句是否执行成功,这样是有失偏颇的,因为当使用创建表的语句时,就算执行成功也会返回-1。9.1.3 使用ExecuteScalar()操作数据库ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,ExecuteScalar()方法的返回值的数据类型是Object类型。如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,如果执行的SQL

17、语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转换来显示,示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接 string strsql = select * from mynews order by id desc; SqlCommand cmd = new SqlCommand(strsql, con); Label1.Text = 查询出

18、了Id为 + cmd.ExecuteScalar() ;/使用ExecuteScalar查询通常情况下ExecuteNonQuery()操作后返回的是一个值,而ExecuteScalar()操作后则会返回一个对象,ExecuteScalar()经常使用于当需要返回单一值时的情况。例如当插入一条数据信息时,常常需要马上知道刚才插入的值,则可以使用ExecuteScalar()方法。示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = new SqlConne

19、ction(str);/创建连接对象 con.Open();/打开连接 string strsql = insert into mynews values (刚刚插入的id是多少?) SELECT IDENTITY as bh;/插入语句 SqlCommand cmd = new SqlCommand(strsql, con);/执行语句 Label1.Text = 刚刚插入的行的id是 + cmd.ExecuteScalar();/返回赋值上述代码使用了SELECT IDENTITY语法获取刚刚执行更新后的id值,然后通过使用ExecuteScalar()方法来获取刚刚更新后第一行第一列的值

20、。9.1.4 使用ExecuteXmlReader()操作数据库ExecuteXmlReader()方法用于操作XML数据库,并返回一个XmlReader对象,若需要使用ExecuteXmlReader()方法,则必须添加引用System.Xml。XmlReader类似于DataReader,都需要通过Command对象的ExecuteXmlReader()方法来创建XmlReader的对象并初始化,示例代码如下所示。 XmlReader xdr = cmd.ExecuteXmlReader();/创建XmlReader对象ExecuteXmlReader()返回XmlReader对象,Xml

21、Reader特性如下所示:q XMLReader是面向流的,它把XML文档看作是文本数据流。q XMLReader是一个抽象类。q XMLReader使用pull模式处理流。q 三个派生类:XMLTextReader、XMLNodeReader和XMLValidatingReader下面代码实现了获取当前节点中属性的个数。 string str = server=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接 st

22、ring strsql = select * from mynews order by id desc FOR XML AUTO, XMLDATA; SqlCommand cmd = new SqlCommand(strsql, con);/创建Command对象 XmlReader xdr = cmd.ExecuteXmlReader();/创建XmlReader对象 Response.Write(xdr.AttributeCount);/读取节点个数上述代码使用了SQL语言中的FOR XML AUTO,、XMLDATA关键字,当执行ExecuteXmlReader()方法时,会返回XmlR

23、eader对象,若不指定FOR XML AUTO,、XMLDATA关键字,则系统会抛出异常。9.2 ASP.NET创建和插入记录在数据库操作中,经常需要对数据库中的内容进行插入操作。例如当有一个用户发布了评论,或者一个用户要购买某个商品,都需要插入记录来保存用户的相应的信息,以便当用户再次登录网站或应用时,能够及时获取自己购买的信息。9.2.1 SQL INSERT数据插入语句使用SQL INSERT语句能够实现数据库的插入,SQL语句必须遵照一些规范,SQL INSERT语句的一般语法形式如下所示: INSERT INTO table_name (column_list) VALUES(DE

24、FAULT|NULL|expression ,n) 上述代码规范了INSERT语句的编写规范,其中:q INSERT是SQL插入关键字。q INTO是表名称之前能够包含的可选关键字。q Table_name是相关的表名称。q column_list是列的集合,如果有多个列可用都好隔开。q VALUES是相应的列的值。如果需要向表mytables插入数据,而mytables里包括自动增长的主键id和title两列,则INSERT语句可以编写为如下代码。 INSERT INTO mytables VALUES (新的新闻标题)上述代码向表mytables中插入了一条新记录,并将title赋值为“新

25、的新闻标题”。值得注意的是,在这条语句中,并没有编写列的集合,是因为当不编写column_list时,则默认为每一个列插入数值。注意:自动增长的主键类型的字段,无需向数据中插入数值,因为SQL Server会自动为该列赋值。如果需要当插入数据时,需要指定插入相应的列的值,则可以将SQL语句代码编写如下。 INSERT INTO mytables (title) VALUES (新的新闻标题)上述代码指定了列title,并对应了相应的值。若在表中存在多个列,列的顺序和列相应的值的顺序必须匹配。例如有3列并分别为number1,string2,datetime3,当需要向其中插入数据时,则可以编写

26、以下SQL语句。 INSERT INTO examtable (number1,string2,datetime3) VALUES (1,this is a string,2008/9/18)上述代码编写了INSERT语句以便数据的插入,同样在插入语句中如果需要插入所有的列,可以简化INSERT语句以便快速进行数据插入,示例代码如下所示。 INSERT INTO examtable VALUES (1,this is a string,2008/9/18)值得注意的是,无论按照何种方法编写SQL语句,值和列都应该相互匹配。9.2.2 使用Command对象更新记录编写了SQL语句后,必须执行S

27、QL语句,在ADO.NET中,执行SQL语句有很多方法,其中推荐使用Command命令的ExecuteNonQuery()。执行SQL语句的命令的必要步骤如下所示。q 打开数据连接。q 创建一个新的Command对象。q 定义一个SQL命令。q 执行SQL命令。q 关闭连接。从上面的步骤可以发现执行SQL语句是非常容易的,首先必须要打开到数据库的连接,示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str);/创建连接对象 co

28、n.Open();/打开连接其中,str是数据连接字串,用来初始化Connection对象,说明如何连接数据库,当数据库连接完毕后,可以使用Open方法打开数据连接。完成数据库连接后,需创建一个新的Command对象,示例代码如下所示。 SqlCommand cmd = new SqlCommand(insert into mynews value (插入一条新数据), con);Command对象的构造函数的参数有两个,一个是需要执行的SQL语句,令一个是数据库连接对象。创建Command对象后,就可以执行SQL命令,执行后完成并关闭数据连接,示例代码如下所示。 cmd.ExecuteNon

29、Query();/执行SQL命令 con.Close();/关闭连接上述代码使用了ExecuteNonQuery()方法执行了SELECT语句的操作,当执行完毕后就需要对现有的连接进行关闭,以释放系统资源。9.2.3 使用DataSet数据集插入记录使用INSERT语句能够完成数据插入,使用DataSet对象也可以完成数据插入。为了将数据库的数据填充到DataSet中,则必须先使用DataAdapter对象的方法实现填充,当数据填充完成后,开发人员可以将记录添加到DataSet对象中,然后使用Update方法将记录插入数据库中。使用DataSet更新记录的步骤如下所示:q 创建一个Connec

30、tion对象。q 创建一个DataAdapter对象。q 初始化适配器。q 使用数据适配器的Fill方法执行SELECT命令,并填充DataSet。q 使用DataTable对象提供的NewRow方法创建新行。q 将数据行的字段设置为插入的值。q 使用DataRowAdd类的Add方法将数据行添加到数据表中。q 把DataAdapter类的InsertCommand属性设置成需要插入记录的INSERT语句。q 使用数据适配器提供的Update方法将新记录插入数据库。q 使用DataSet类提供的AcceptChanges方法将数据库与内存中的数据保持一致。当使用DataSet插入记录前,需要创

31、建Connection对象以保证数据库连接,示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接上述代码创建了一个数据库连接,并打开了数据库连接。完成数据连接后,就需要查询表中的数据并使用DataAdapter对象初始化适配器,示例代码如下所示。 string strsql = select * from mynews;/编写SQL语句 SqlDataAdapt

32、er da = new SqlDataAdapter(strsql, con);/创建适配器DataAdapter对象默认构造函数包括两个参数,其中一个参数是需要执行的SQL语句,另一个是Connection对象。在初始化适配器后,需要对适配器的相应的属性做设置,使用SqlCommandBuilder对象可以让系统构造InsertCommand属性,示例代码如下所示。 SqlCommandBuilder build = new SqlCommandBuilder(da);/构造SQL语句使用适配器的Fill方法能够填充DataSet数据集,示例代码如下所示。 DataSet ds = new

33、DataSet();/创建数据集 da.Fill(ds, datatable);/填充数据集 DataTable tb = ds.Tablesdatatable;/创建表 tb.PrimaryKey = new DataColumn tb.Columnsid ;/创建表的主键上述代码创建了一个DataSet数据集对象,被填充数据后,数据集中表的名称被命名为datatable,该命名与数据库中的表的名称并不冲突。填充了DataSet数据对象后,需要使用DataRow对象为DataSet添加数据,示例代码如下所示。 DataRow row = ds.Tablesdatatable.NewRow()

34、;/创建DataRow rowtitle = 使用DataSet插入新行;/赋值新列 rowid = 15;上述代码使用了NewRow方法创建新行返回DataRow对象,当DataRow对象中的相应的元素被赋值后,则需要使用Rows.Add方法增加新行,因为只对DataRow对象赋值,并不能自动的在数据库中增加新行。示例代码如下所示。 ds.Tablesdatatable.Rows.Add(row);/添加新行上述代码将数据更新到DataSet数据集中,为了保持数据集中的数据和数据库的数据的一致性,需使用Update方法,示例代码如下所示。 da.Update(ds, datatable);/

35、更新数据当执行了Update方法后,数据库中的数据就会同步DataSet数据集中的数据进行数据更新。9.3 ASP.NET更新数据库在应用程序的开发中,常常会需要对数据库中现有的内容进行更新操作。ADO.NET提供了若干不同的更新数据库中记录的方法,如果需要更新数据库中的某列的值或者某几列的值,则需要使用SQL UPDATE命令进行数据库更新。9.3.1 SQL UPDATE数据更新语句使用SQL UPDATE语句能够实现数据库中数据的更新,SQL UPDATE语句的一般语法格式如下所示。 UPDATE table_name SET column1_name=expression1, colu

36、mn2_name=expression2, . . columnN_name=expressionN WHERE condition1 AND|OR condition2 上述代码规范了UPDATE语句的编写规范,其中:q UPDATE是SQL更新关键字。q table_name是需要更新的表的名称。q columnN_name是需要更新的列的名称。q expression是列相应的值。q WHERE是SQL语句关键字。q condition是条件。如果需要更新表mytable中的某行的数据,则可以编写SQL UPDATE语句进行更新,示例代码如下所示。 UPDATE mytable SET

37、title=修改后的数据 where id=3上述代码更新了id为3的数据中的title,并将title字段的值修改为“修改后的数据”。9.3.2 使用Command对象更新记录如需要执行UPDATE语句时,同样可以使用Command对象执行语句。Command对象基本上能够执行所有需要进行数据更新的SQL语句。使用Command对象进行数据库操作的步骤基本如下所示。q 创建数据库连接。q 创建一个Command对象,并指定一个SQL UPDATE(或存储过程)。q 使用Command对象的ExecuteNonQuery()方法执行UPDATE(或存储过程)。q 关闭数据库连接。当需要执行UP

38、DATE语句时,首先必须要打开到数据库的连接,打开连接后,使用Command对象执行SQL语句,示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa; SqlConnection con = new SqlConnection(str);/创建连接对象 con.Open();/打开连接其中,str同样是数据连接字串,用来初始化Connection对象,说明如何连接数据库,当数据库连接完毕后,可以使用Open方法打开数据连接。完成数据库连接后,需创建一个新的Command对象进行数据更新,示例代码如下所示。 Sq

39、lCommand cmd = new SqlCommand(UPDATE mynews SET title=修改后的数据 where id=3, con);/创建Command对象Command对象的构造函数的参数有两个,一个是需要执行的SQL语句,令一个是数据库连接对象。创建Command对象后,就可以执行SQL命令,执行后完成并关闭数据连接,示例代码如下所示。 cmd.ExecuteNonQuery();/执行SQL命令 con.Close();/关闭连接上述代码使用了ExecuteNonQuery()方法进行SQL UPDATE语句的执行,从而能够更新数据库中的相应数据。9.3.3 使用

40、DataSet数据集更新记录ADO.NET的DataSet对象提供了更好的编程实现数据库的更新功能。因为DataSet对象与数据库始终不是连接的,开发人员可以向脱离数据库的DataSet对象中增加列、删除列或更新列。当完成了修改后,则可以通过将DataSet对象连接到DataAdapter对象来将记录传输给数据库。DataSet更新记录的步骤如下所示。q 创建一个Connection对象。q 创建一个DataAdapter对象。q 初始化适配器。q 使用数据适配器的Fill方法执行SELECT命令,并填充DataSet。q 执行SqlCommandBuilder方法生成UpdataCommand方法。q 创建DataTable对象并指定相应的DataSet中的表。q 创建DataRow对象并查找需要修改的相应行。q 更改DataRow对象中的列的值。q 使用Update方法进行数据更新。在更新记录前,首先需要查询出相应的数据,查询相应的数据后才能够填充DataSet,示例代码如下所示。 string str = server=(local);database=mytable;uid=sa;pwd=sa;/创建连接字串 SqlConnection con = ne

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com