1、1,第9章 使用ADO.NET访问数据库,本章讲述的主要内容9.1 ADO.NET和数据库通用接口9.2 数据库连接对象(Connection)9.3 数据库命令对象(Command)9.4 数据读取对象(DataReader)9.5 数据适配器对象(DataAdapter),2,9.1 ADO.NET和数据库通用接口,9.1.1 ADO.NET概述 ADO.NET是对ADO的一个跨时代的改进,它们之间有很大的差别。 ADO.NET可通过DateSet对象在“断开连接模式”下访问数据库。 访问数据库中的数据时,首先要建立连接,下载数据到本地缓冲区,之后断开与数据库的连接。 此时用户对数据的操作
2、(查询、添加、修改、删除等)都是在本地进行的。 只有需要更新数据库中的数据时,才再次与数据库连接,在发送修改后的数据到数据库后关闭连接。,3,9.1 ADO.NET和数据库通用接口,应用程序访问数据库的传统方式,9.1.2 数据库通用接口,4,9.1 ADO.NET和数据库通用接口,9.1.2 数据库通用接口 美国微软公司提供的数据库通用接口程序,经过了ODBCOLEDBADOADO.NET几个发展阶段。 1. ODBC通用数据库接口ODBC(Open Database Connectivity,开放数据库连接) 开放数据库连接ODBC是Microsoft倡导的数据库服务器连接标准,它向访问各
3、种Web数据库的应用程序提供了一种通用的接口。在此标准支持下,一个应用程序可以通过一组通用的代码实现对各种不同数据库系统的访问。 因为通过ODBC访问数据库的方式是基于SQL的,所以各种应用程序均可透过各种数据库所对应的ODBC驱动程序实现利用SQL语言对不同数据库系统的访问。,5,透过ODBC访问数据库的方式,6,2. ADO通用数据库接口 ADO(ActiveX Data Object)是ASP内置的、用于访问Web数据库的ActiveX服务器组件,包含多种对象和集合。ADO组件对象被包含在ASP脚本程序中,用来完成与数据库的连接,并可使用SQL语言对数据库进行各种操作。 ADO将绝大部分
4、的数据库操作功能封装在7个对象及有关的数据集合之中,通过在ASP脚本程序中调用这些对象和数据集合来执行相应的数据库操作。,7,8,9.1 ADO.NET和数据库通用接口,9.1.3 ADO.NET的数据模型 ADO.NET采用了层次管理的结构模型,各部分之间的逻辑关系如下图所示。,9,9.1.4 ADO.NET中的常用对象,10,ADONET对象模型由以下几个核心组件组成。 Connections 连接和管理数据库事务。 Commands 向数据库发送的命令。 DataReaders直接读取流数据。 Datasets 和 DataAdapters 对缓存中的数据进行存储和操作。Connecti
5、on对象建立与数据库间的连接中;Commands对象向数据库提供者发出命令,返回的结果以一种流的方式贯穿于这此连接中;结果集可以用DataReaders 快速地读取,也可以通过DataAdapters 对象将数据储存到缓存中的 Datasets 对象中,让用户在数据集中访问和操作记录。,11,对SQL数据库而言,连接模式访问数据库的开发流程有以下几个步骤:创建SqlConnection对象与数据库建立连接;创建SqlCommand对象对数据库执行SQL命令或存储过程,包括增、删、改及查询数据库等命令;如果查询数据库的数据,则创建SqlDataReader对象读取SqlCommand命令查询到的
6、结果集,并将查到的结果集绑定到控件上。,12,9.2 数据库连接对象(Connection),9.2.1 Connection对象概述 Connection类提供了对数据源连接的封装。类中包括连接方法及描述当前连接状态的属性。 在Connection类中最重要的属性是ConnectionString (连接字符串),该属性用来指定数据库服务器名称、数据源信息及其他登录信息。 ConnectionString中有两个重要的重要的部分:字符串内容数据提供程序名称。 字符串内容中包含有“DataSource”(数据源)、“Initial Catalog”(默认连接数据库)及用于描述用户身份的“Use
7、r ID”和“Password”。,13,在ADO.NET中,连接数据源有4种数据提供程序。如果要在应用程序中使用任何一种数据提供程序,必须在后台代码中引用对应的命名空间,类的名称也随之变化。,14,9.2 数据库连接对象(Connection),9.2.2 创建Connection对象SQL数据库的Connection对象:SqlConnection 连接对象名 = new SqlConnection(连接字符串);或:SqlConnection 连接对象名 = new SqlConnection(); 连接对象名.ConnectionString = 连接字符串;Access数据库的Con
8、nection对象OleDbConnection 连接对象名 = new OleDbConnection(); 连接对象名.ConnectionString = 连接字符串;,15,9.2 数据库连接对象(Connection),9.2.3 Connection对象的属性和方法1. Connection对象的属性,16,9.2 数据库连接对象(Connection),9.2.3 Connection对象的属性和方法2. Connection对象的方法,17,Open方法Connection对象的打开操作,任何一个数据库在完成连接之后,即在访问之前都要先进行打开操作。打开操作使用Connecti
9、on对象有关方法来完成,即Open方法,其格式为:Connection对象名.Open();Close方法同样道理,在连接使用完成之后,还需要关闭数据连接。关闭操作使用Connection对象的有关方法来完成.即Close方法,其格式为:Connection对象名.Close();,2018年7月6日,计算机应用技术系教师专用(ASP.NET程序设计),18,2018年7月6日,计算机应用技术系教师专用(ASP.NET程序设计),19,CreateCommand方法CreateCommand方法创建并返回一个与该连接关联的SqlCommand对象,其格式为: Connection对象名.Cre
10、ateCommand();例如:SqlCommand cmd=conn.CreatCommand();,2018年7月6日,计算机应用技术系教师专用(ASP.NET程序设计),20,9.2 数据库连接对象(Connection),9.2.4 数据库的连接字符串1. 连接字符串中的常用属性,21,ConnectionString属性通常包含以下参数,各参数间用“;”分隔。Provider:用于设置数据源的OLE DB驱动程序。如:Access为“Microsoft.Jet.OLEDB.4.0”;SQL Server 6.5或之前版本为“SQLOLEDB”。Data Source:设置数据源的实际
11、路径。Password:设置登录数据库所使用的密码。User ID:设置登录数据库时所使用的帐号。例如,连接Access数据库的的连接参数为:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:abc.mdb,9.2 数据库连接对象(Connection),9.2.4 数据库的连接字符串1. 连接字符串中的常用属性,22,对于SQL7.0或更高版本的SQL数据库,ConnectionString属性包含的主要参数有:,Data Source或Server:设置需连接的数据库服务器名称。Initial Catalog或Database:设置连接的数据库名
12、称。AttachDBFilename:设置附加数据库的路径和文件名。User ID 或 uid:登录SQL Server数据库的账户。Password 或 pwd:登录SQL Server数据库的密码。Integrated Security或Trusted_Connection:是否使用Windows集成身份验证,值有三种:true、false和SSPI,true和SSPI表示使用Windows集成身份验证。Connection Timeout:设置SqlConnection对象连接SQL数据库服务器的超时时间,单位为秒,若在所设置的时间内无法连接数据库,则返回失败信息。默认为15秒。,23,
13、9.2 数据库连接对象(Connection),9.2.4 数据库的连接字符串2. 连接到SQL Server的连接字符串 通过SqlConnection对象的ConnectionString属性,设置或获取连接字符串,连接Microsoft SQL Server 7.0或更高版本。连接数据库时,有两种验证模式:标准安全连接信任连接(Windows集成验证模式)标准安全连接,语法格式为:Data Source=服务器名或IP;Initial Catalog=数据库名;User ID=用户名;Password=密码或者“Server=服务器名或IP;AttachDbFilename=数据库文件名
14、;Uid=用户名;Pwd=密码;Trusted_Connection=False,24,例如:Data Source =localhost; Initial Catalog=northwind; User Id=sa;pwd=123Data Source =localhost或(local)表示连接本机SQL数据库的默认服务器。Data Source=.SQLEXPRESS; AttachDbFilename=|DataDirectory|company_Data.mdf; User ID=sa;Password=123;Data Source= .SQLEXPRESS表示SQL Server
15、 2005的SQLEXPRESS数据库服务器;AttachDbFilename表示数据库的路径和文件名。|DataDirectory|表示网站默认数据库路径App_Data。标准安全必须在连接字符串中以明文形式保存用户名和密码,因此安全性较差。,25,信任连接(Windows集成验证模式) 不发送用户名和密码;仅发送用户通过身份验证的信息。从安全角度考虑,建议使用Windows集成验证模式。 使用Windows集成验证模式的连接参数为: Data Source=服务器名或IP;Initial Catalog=数据库名;Integrated Security=true;或: Data Sourc
16、e =服务器名或IP;AttachDbFilename=数据库文件名; Trusted_Connection=SSPI;例如: Data Source = .SQLEXPRESS; AttachDbFilename= |DataDirectory|jxgl_Data.MDF; Integrated Security=True; User Instance =True;,26,如果将数据库放在网站的App_Data目录下。则创建的Student数据库的连接参数应设置为:Data Source=.SQLEXPRESS; AttachDbFilename=|DataDirectory|Student
17、.mdf; Integrated Security=True;User Instance=True其中,|DataDirectory|表示网站默认数据库路径App_Data。,27,9.2 数据库连接对象(Connection),9.2.4 数据库的连接字符串3. 连接到OLE DB数据源的连接字符串 通过OleDbConnection对象的ConnectionString属性,设置或获取连接字符串,提供与OLE DB公开数据源的连接或SQL Server 6.x更早版本的连接。 对于OLE DB数据提供程序,连接字符串格式中的Provider关键字是必需的,必须为OleDbConnectio
18、n连接字符串指定提供程序名称。 到Access数据库的连接字符串: Provider=Microsoft.Jet.OLEDB.4.0; Data Source=数据库名;User ID=用户名;Password=密码Provider=Microsoft.Jet.OLEDB.4.0;Data Source= |DataDirectory|Northwind.mdb;,28,SqlConnectionconn.ConnectionString = & _ Initial Catalog=Northwind,Connection 对象 SqlClient vs. OleDb,只能连接 Microso
19、ft SQL Server效益最佳需引用 System.Data.SqlClient可以通过 OLE DB 连接不同的数据库应用范围广泛需引用 System.Data.OleDb也可以连接 Microsoft SQL Server,29,9.2 数据库连接对象(Connection),9.2.4 数据库的连接字符串4. 连接字符串的存放位置(1) 把连接字符串写在程序中 要在许多页面中写入连接字符串,这时候如果需要改动连接字符串(比如换用户名和密码)的话,就得逐个修改。(2) 把连接字符串放在web.config文件中 ,30,例如:在web.config配置文件的节中添加如下的代码。, ,3
20、1,web.config文件中有了连接字符串后,就可以使用System.Configuration.ConfigurationManager类读取连接字符串。 代码如下:System.Configuration.ConfigurationManager.ConnectionStrings连接字符串名.ToString();例如:string strCnn= ConfigurationManager.ConnectionStringsStudentCnnString.ToString();SqlConnection cnn = new SqlConnection(strCnn);为了使上述代码正
21、常工作,必须引入命名空间: using System.Configuration,32,例9-1:创建并打开SQL Server数据库的连接,并在标签控件中显示当前数据库连接的状态,如图所示。,33,1.添加数据库文件,设计Web.config文件。 找到并删除节,添加新的连接字符串。 2.设计Web页面。,34,3.编写代码(1)添加SQL Server数据库命名空间的引用: using System.Data; using System.Data.SqlClient; using System.Configuration;(2)声明连接字符串和Connection对象: string Co
22、nnStr = System.Configuration.ConfigurationManager. ConnectionStringsConnString.ToString(); SqlConnection conn = new SqlConnection();(3)页面装入时执行的事件代码: protected void Page_Load(object sender, EventArgs e) conn.ConnectionString = ConnStr; Label1.Text = 当前连接状态: + conn.State.ToString(); ,35,(4)“连接数据库”按钮的事
23、件代码: protected void ButtonOpen_Click(object sender, EventArgs e) conn.Open(); Label1.Text = 当前连接状态: + conn.State.ToString(); (5)“关闭连接”按钮的事件代码: protected void ButtonClose_Click(object sender, EventArgs e) conn.Close(); Label1.Text = 当前连接状态: + conn.State.ToString(); ,36,9.3 数据库命令对象(Command),9.3.1 创建Co
24、mmand对象1. 使用构造函数创建Command对象 下面是使用构造函数创建SqlCommand对象,并通过该对象的构造函数参数来设置特定属性值,其语法格式如下:SqlCommand 命令对象名=new SqlCommand(查询字符串,连接对象名);例如: SqlCommand cmd = new SqlCommand(Select * From StudentInfo, conn);,37,9.3 数据库命令对象(Command),9.3.1 创建Command对象1.使用构造函数创建Command对象SqlCommand 命令对象名 = new SqlCommand();命令对象名.C
25、onnection = 连接对象名;命令对象名.CommandText = 查询字符串;例如:SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandText = Select * From StudentInfo;,38,9.3 数据库命令对象(Command),2. 使用CreateCommand()方法创建Command对象使用Connection对象的CreateCommand()方法创建SqlCommand对象的语法格式:SqlCommand Command对象名=Connection对象名.CreateC
26、ommand();Command对象名.CommandText = 查询字符串;例如:SqlCommand cmd = conn.CreateCommand();cmd.CommandText = Select * From StudentInfo;,39,9.3 数据库命令对象(Command),例如:通过CommandText属性执行SQL语句: string ConnStr = ConfigurationManager. ConnectionStrings ConnString.ToString(); SqlConnection conn = new SqlConnection(Conn
27、Str); string sqlstr = Select * From StudentInfo; SqlCommand cmd = new SqlCommand(sqlstr, conn);通过CreateCommand方法执行SQL语句 SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = sqlstr;,40,9.3 数据库命令对象(Command),3.调用存储过程通过CommandText属性执行存储过程:SqlCommand cmd = new SqlCommand(ProcName, conn);cmd.CommandTy
28、pe = CommandType.StoredProcedure;或者:SqlCommand command = new SqlCommand();command.Connection = Conn;command.CommandType = CommandType.StoredProcedure;command.CommandText = ProcName;,41,9.3 数据库命令对象(Command),9.3.2 Command对象的属性和方法,SqlCommand对象的常用属性CommandText:获取或设置要对数据源执行的SQL命令、存储过程或数据表名称CommandType:获取
29、或设置命令类型,可取的值:CommandType.Text:SQL命令,默认为TextCommandType.StoredProduce:存储过程CommandType.TableDirect:数据表名称Connection:获取或设置SqlCommand对象所使用的数据连接属性Parameters:SQL命令参数集合Transaction:设置Command对象所属的事务,42,9.3 数据库命令对象(Command),9.3.2 Command对象的属性和方法Cancel:取消SqlCommand对象的执行CreateParameter:创建Parameter对象ExecuteNonQue
30、ry:返回数据表被影响的行数。该方法只能执行Insert、Update和Delete命令。ExecuteReader:返回DataReader对象。该方法用于执行返回多条记录的Select命令。ExecuteScalar:以object类型返回结果表第一行第一列的值。该方法一般用来执行查询单值的Select命令ExecuteXmlReader:返回XmlReader对象。该方法以XML文档格式返回结果集,43,1. ExecuteScalar方法ExecuteScalar方法一般用来执行查询单值的Select命令,它以object类型返回结果表第一行第一列的值。Command对象名.Execu
31、teScalar();对数据库操作时,具体步骤如下:创建SqlConnection对象,设置连接字符串;创建SqlCommand对象,设置它的Connection和CommandText属性;打开与数据库连接;使用SqlCommand对象的ExecuteScalar方法执行CommandText中的命令;并返回结果表第一行第一列的值供应用程序使用。关闭与数据库连接;,44,例9-2:使用ExecuteScalar方法返回表中的记录总数,如图所示。,1.添加SQL Server数据库命名空间的引用: using System.Data; using System.Data.SqlClient;
32、using System.Configuration;,45,2. 页面装入时执行的事件代码:protected void Page_Load(object sender, EventArgs e) string ConnStr = ConfigurationManager.ConnectionStringsConnString.ToString(); int count = 0; SqlConnection conn = new SqlConnection(ConnStr) string SqlStr = Select Count(*) From 产品; SqlCommand cmd = n
33、ew SqlCommand(SqlStr, conn); conn.Open(); count = (int)cmd.ExecuteScalar(); conn.Open(); Response.Write(数据库中记录总数为: + count.ToString(); ,46,2.ExecuteNonQuery方法ExecuteNonQuery方法执行指定的命令,但不返回任何结果。用来执行Insert、Update和Delete命令,因此可以增加、修改和删除数据库中的数据。 Command对象名. ExecuteNonQuery();例如:SqlCommand cmd = new SqlCom
34、mand(INSERT INTO titles(title_id, title, type, pubdate) VALUES(JP101, Programming Microsoft .NET, bussiness, May 2002), conn);cmd.ExecuteNonQuery();SqlCommand cmd = new SqlCommand(UPDATE titles SET title_id= JP2002 WHERE title_id = JP1001, conn);cmd.ExecuteNonQuery();SqlCommand cmd = new SqlCommand(
35、DELETE FROM titles WHERE title_id = JP202, conn);cmd.ExecuteNonQuery();,47,3.ExecuteReader方法ExecuteReader方法执行指定的命令,并返回一个读写器对象SqlDataReader。Command对象名. ExecuteReader(); SqlDataReader对象是一个向前只读的记录指针,用于快速读取数据。对于只需要顺序显示数据表中记录的应用而言,SqlDataReader对象是比较理想的选择。 在读取数据时,它需要与数据源保持实时连接,以循环的方式读取结果集中的数据。 SqlDataRead
36、er对象不能直接实例化,而必须调用SqlCommand对象的ExecuteReader方法才能创建有效的SqlDataReader对象。 SqlDataReader对象一旦创建,即可通过对象的属性、方法访问数据源中的数据。,48,例9-3:使用ExecuteReader()方法,将查询返回值显示到GridView控件中,如图所示。,1.添加SQL Server数据库命名空间的引用: using System.Data; using System.Data.SqlClient; using System.Configuration;,49,2.设置到JXGL数据库的连接字符串 ,50,3.“查询
37、”按钮被单击时执行的事件代码如下:protected void Button1_Click(object sender, EventArgs e) string ConnStr = ConfigurationManager.ConnectionStrings ConnString.ToString(); SqlConnection conn = new SqlConnection(ConnStr); SqlCommand cmd = new SqlCommand(, conn); cmd.CommandType = CommandType.Text; cmd.CommandText = sel
38、ect * from 教师表 where 职称=Id and 学历=Name; cmd.Parameters.AddWithValue(Id, TextBox1.Text); cmd.Parameters.AddWithValue(Name, TextBox2.Text); conn.Open(); GridView1.DataSource = cmd.ExecuteReader(); GridView1.DataBind(); conn.Close();,51,9.4 数据读取对象(DataReader),应用程序,毛毛,浙江水专,优秀,毛毛,姓名:,学校:,浙江水专,成绩:,优秀,Data
39、Reader,使用 DataReader 对象,数 据 库,52,9.4 数据读取对象(DataReader),9.4.1 DataReader对象的常用属性及方法1) FieldCount属性:该属性用来获取当前行中的列数,如果未放置在有效的记录集中,则返回0,否则返回列数(字段数),默认值为-1。2) HasRows属性:用来获取DataReader对象中是否包含行。3) Read()方法:使用该方法可将Reader记录指针移到下一行,从而可使用列名或列的次序来访问列的值。如果到了数据表的最后,则返回一个布尔值false。4) GetValue(int i)方法:根据传入的列的索引值,返回
40、当前记录行里指定列的值。,53,Close()方法:关闭SqlDataReader对象。NextResult()方法:当返回多个结果集时,使用该方法让记录指针指向下一个结果集。GetValues(Object values)方法:该方法会把当前记录行里所有的数据保存到一个数组里。可以使用FieldCount属性来获知记录里字段的总数,据此定义返回值的数组长度。GetDataTypeName(int i)方法:通过列索引获得列的类型。GetName(int i)方法:通过列索引获得列的名称。综合使用GetName和GetValue两方法,可以获得数据表里列名和列的字段。,54,使用SqlData
41、Reader对象查询数据库的一般步骤:创建SqlConnection对象,设置连接字符串;创建SqlCommand对象,设置它的Connection和CommandText属性,分别表示数据库连接和需要执行的SQL命令。打开与数据库连接;使用SqlCommand对象的ExecuteReader方法执行CommandText中的命令;并把返回的结果放在SqlDataReader对象中。通过循环,处理数据库查询结果。逐行读取数据:DataReader对象.Read()读取某列的数据:(type)dataReader对象 关闭与数据库连接。,55,使用SqlDataReader对象时,应注意以下几点
42、:必须通过SqlCommand对象的ExecuteReader()方法,产生SqlDataReader对象的实例。读取数据时,SqlConnection对象必须处于打开状态。只能按向下的顺序逐条读取记录,不能随机读取。且无法直接获知读取记录的总数。SqlDataReader对象管理的查询结果是只读的,不能修改。,56,9.4 数据读取对象(DataReader),9.4.2 使用DataReader对象【例9-4】使用DataReader对象设计一个用户登录身份验证页面,页面打开时如图9-7所示,用户在输入了正确的用户名和密码后,程序将根据用户级别跳转到不同的页面。 例9-4,57,1.设计W
43、eb页面2.设置对象属性3.设置连接参数 4.添加Access数据库命名空间的引用: using System.Data; using System.Data.OleDb; using System.Configuration;,Admin,58,5.“登录”按钮被单击时执行的事件代码如下:protected void Button1_Click(object sender, EventArgs e) string ConnStr = ConfigurationManager.ConnectionStringsConnString.ToString(); using (OleDbConnect
44、ion conn = new OleDbConnection(ConnStr) conn.Open(); string StrSQL = select ulevel from Admin where uname= + TextBox1.Text + and upwd= + TextBox2.Text + ; OleDbCommand com = new OleDbCommand(StrSQL, conn); OleDbDataReader dr = com.ExecuteReader(); dr.Read(); string UserLevel;,59,if (dr.HasRows) User
45、Level = drulevel.ToString();else Response.Write(alert(用户名或密码错!);); return;if (UserLevel = 0) Sessionpass = admin; Response.Redirect(default2.aspx); else Sessionpass = guest; Response.Redirect(default3.aspx); ,60,6.manager.aspx页面装入时执行的事件代码如下: protected void Page_Load(object sender, EventArgs e) this.
46、Title = 管理页面; string IsPass = (string)Sessionpass; if (IsPass != admin) Response.Write(alert(请先登录!);); Response.Redirect(default.aspx); Response.Write(这是管理员页面); ,61,7.guest.aspx页面装入时执行的事件代码如下: protected void Page_Load(object sender, EventArgs e) this.Title = 游客页面; string IsPass = (string)Sessionpass; if (IsPass != guest) Response.Redirect(default.aspx); Response.Write(这是游客页面); ,