《C与数据库访问技术.doc》由会员分享,可在线阅读,更多相关《C与数据库访问技术.doc(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流C与数据库访问技术.精品文档.2.1 ADO.NET概述22.1.1 ADO.NET体系结构22.1.2 ADO.NET对象模型32.2 Connection 对象与数据库连接42.2.1 Connection对象的常用属性42.2.2 Connection对象的连接字符串52.2.3 Connection对象的常用方法72.3 Command(数据命令)对象与查询语句102.3.1 Command对象的常用属性112.3.2 Command对象的常用方法112.3.3 Command对象创建SQl语句代码示例14综合示例154.4.2 实例
2、演示DataReader292.4 DataReader对象与数据获取322.4.1 DataReader对象的常用属性322.4.2 DataReader对象的常用方法322.4.3 DataReader对象访问数据库代码示例332.5 DataAdaDter对象352.5.1 DataAdapter对象的常用属性352.5.2 DataAdapter对象的常用方法362.5.3 DataAdapter对象代码示例372.6 DataSet对象392.6.1 DataSet对象概述392.6.2 DataSet对象模型392.6.3 DataCOIumn和DataRow对象412.6.4 使
3、用DataSet对象访问数据库442.7 ADO.NET 代码综合示例452.7.1 使用OLE DB.NET Provider452.7.2 使用SQL Server .NET Provider462.7.3 数据库访问综述472.8 DataGrid控件与数据库访问技术472.8.1 DataGrid控件与数据绑定472.8.2 DataGrid代码示例482.9 本章小结49 C#与数据库访问技术 ADO.NET(ActiveX Data Object.NET)是Microsoft公司开发的用于数据库连接的一套组件模型,是ADO的升级版本。 由于ADO.NET组件模型很好地融入了.NET
4、 Framework,所以拥有.NET Framework的平台无关、高效等特性。程序员能使用ADO.NET组件模型,方便高效地连接和访问数据库。1 ADO.NET概述 ADO.NET是与数据库访问操作有关的对象模型的集合,它基于Microsoft的.NET Framework,在很大程度上封装了数据库访问和数据操作的动作。 ADO.NET同其前身ADO系列访问数据库的组件相比,做了以下两点重要改进: ADO.NET引入了离线的数据结果集(Disconnected DataSet)这个概念,通过使用离线的数据结果集,程序员更可以在数据库断开的情况下访问数据库。 ADO.NET还提供了对XML格
5、式文档的支持,所以通过ADO.NET组件可以方便地在异构环境的项目间读取和交换数据。1.1 ADO.NET体系结构 ADO.NET组件的表现形式是.NET的类库,它拥有两个核心组件:.NET Data Provider(数据提供者)和DataSet(数据结果集)对象。 .NET Data Provider是专门为数据处理以及快速地只进、只读访问数据而设计的组件,包括Connection、Command、DataReader和DataAdapter四大类对象,其主要功能是: 在应用程序里连接数据源,连接SQL Server数据库服务器。 通过SQL语句的形式执行数据库操作,并能以多种形式把查询到
6、的结果集填充到DataSet里。 DataSet对象是支持ADO.NET的断开式、分布式数据方案的核心对象。DataSet是数据的内存驻留表示形式,无论数据源是什么,它都会提供一致的关系编程模型。它是专门为独立于任何数据源的数据访问而设计的。 DataSet对象的主要功能是: 用其中的DataTable和DataRelations对象来容纳.NET Data Provider对象传递过来的数据库访问结果集,以便应用程序访问。 (2)把应用代码里的业务执行结果更新到数据库中。 并且,DataSet对象能在离线的情况下管理存储数据,这在海量数据访问控制的场合是非常有利的。图2-1描述了ADO.NE
7、T组件的体系结构。图2-1 ADO.NET体系结构1.2 ADO.NET对象模型 ADO.NET对象模型中有5个主要的数据库访问和操作对象,分别是Connection、Command、DataReader、DataAdapter和DataSet对象。 其中,Connection对象主要负责连接数据库,Command对象主要负责生成并执行SQL语句,DataReader对象主要负责读取数据库中的数据,DataAdapter对象主要负责在Command对象执行完SQL语句后生成并填充DataSet和DataTable,而DataSet对象主要负责存取和更新数据。 ADO.NET主要提供了两种数据提
8、供者(Data Provider),分别是SQL Server.NET Provider和OLE DB.NET Provider。 SQL Server.NET Framework数据提供程序使用它自身的协议与SQL Server数据库服务器通信,而OLEDB.NET Framework则通过OLE DB服务组件(提供连接池和事务服务)和数据源的OLE DB提供程序与OLE DB数据源进行通信。 它们两者内部均有Connection、Command、DataReader和DataAdapter 4类对象。对于不同的数据提供者,上述4种对象的类名是不同的,而它们连接访问数据库的过程却大同小异。
9、这是因为它们以接口的形式,封装了不同数据库的连接访问动作。正是由于这两种数据提供者使用数据库访问驱动程序屏蔽了底层数据库的差异,所以从用户的角度来看,它们的差别仅仅体现在命名上。表2-1描述了这两类数据提供者下的对象命名。表2-1 ADO.NET对象描述对象名OLE DB数据提供者的类名SQL Server数据提供者类名Connection对象OleDbConnectionSqlConnection Command对象OleDbCommandSqlCommandDataReader对象OleDbDataReaderSqlDataReaderDataAdapter对象OleDbDataAdapt
10、erSqlDataAdapter2.2 Connection 对象与数据库连接 在不同的Provider类型下,Connection对象的命名也是不同的,但它们有一个共同的功能,那就是管理与数据源的连接。2.2.1 Connection对象的常用属性 Connectionion对象主要用于连接数据库,它的常用的属性如下。 ConnectionString属性:该属性用来获取或设置用于打开SQL Server数据库的字符串。ConnectionTimeout属性:该属性用来获取在尝试建立连接时终止尝试,并生成错误之前所等待的时间。DataBase属性:该属性用来获取当前数据库或连接打开后要使用的
11、数据库的名称。DataSource属性:该属性用来设置要连接的数据源实例名称,例如SQLServer的Local服务实例。 State性该属性:是一个枚举类型的值,用来表示同当前数据库的连接状态。该属性的取值情况和含义如表2-2所示。表2-2 Provider值描述(ConnectionSate枚举成员值)属 性 值对应含义 Broken该连接对象与数据源的连接处于中断状态。只有当连接打开后再与数据库失去连接才会导致这种情况。可以关闭处于这种状态的连接,然后重新打开(该值是为此产品的未来版本保留的)Closed该连接处于关闭状态Connecting该连接对象正在与数据源连接(该值是为此产品的未
12、来版本保留的)Executing该连接对象正在执行数据库操作的命令Fetching该连接对象正在检索数据Open该连接处于打开状态State属性一般是只读不写的,以下代码演示了使用State属性管理控制数据连接的方式。/设置连接对象SqlConnection conn;/如果是空闲状态,连接数据库if(conn.State = ConnectionState.Closed) conn.Open();/访问数据库的代码/最后关闭连接if(conn.State = ConnectionState.Open)conn.Close();2.2.2 Connection对象的连接字符串在Connecti
13、onString连接字符串里,一般需要指定将要连接数据源的种类、数据库服务器的名称、数据库名称、登录用户名、密码、等待连接时间、安全验证设置等参数信息,这些参数之间用分号隔开。下面将详细描述这些常用参数的使用方法。 1. Provider参数 Provider参数用来指定要连接数据源的种类。如果使用的是SQL Server Datahovider,则不需要指定Provider参数,因为SQL Server DataProvider已经指定了所要连接的数据源是SQl Server服务器。如果使用的是O1eDB Data Provider或其他连接数据库,则必须指定Provider参数。表2-3说
14、明了Provider参数值和连接数据源类型之间的关系。表2-3 Provider值描述 Provider值 对应连接的数据源SQL OLE DB Microsoft OLEDB Provider for SQL ServerMSDASQLMicrosoft OLEDB Provider for ODBCMicrosoft. Jet. OLEDB.4.0Microsoft OLEDB Provider for AccessMSDAORAMicrosoft OLEDB Provider for Oracle2.Server参数Server参数用来指定需要连接的数据库服务器(或数据域)。比如Serv
15、er=(local),指定连接的数据库服务器是在本地。如果本地的数据库还定义了实例名,Server参数可以写成Server=(local)实例名。另外,可以使用计算机名作为服务器的值。如果连接的是远端的数据库服务器,Server参数可以写成Server=IP或“Server=远程计算机名”的形式。Server参数也可以写成Data Source,比如Data Source=IP。server=(local);Initial Catalog=student;user Id=sa; password= ;Data Source=(localhost);Initial Catalog=student
16、;user Id=sa; password= ; 3.DataBase参数DataBase参数用来指定连接的数据库名。比如DataBase=Master,说明连接的数据库是Master,DataBase参数也可以写成Initial Catalog,如Initial Catalog=Master。 4.Uid参数和Pwd参数Uid参数用来指定登录数据源的用户名,也可以写成UserID。比如Uid(User ID)=sa,说明登录用户名是sa。Pwd参数用来指定连接数据源的密码,也可以写成Password。比如Pwd(Password)=,说明登录密码是。 5.Connect Timeout参数C
17、onnect Timeout参数用于指定打开数据库时的最大等待时间,单位是秒。如果不设置此参数,默认是15秒。如果设置成-1,表示无限期等待,一般不推荐使用。 6.Integrated Security参数Integrated Security参数用来说明登录到数据源时是否使用SQL Server的集成安全验证。如果该参数的取值是True(或SSPI,或Yes),表示登录到SQL Server时使用Windows验证模式,即不需要通过Uid和Pwd这样的方式登录。如果取值是False(或No),表示登录SQL Server时使用Uid和Pwd方式登录。一般来说,使用集成安全验证的登录方式比较安
18、全,因为这种方式不会暴露用户名和密码。安装SQL Server时,如果选中“Windows身份验证模式”单选按钮则应该使用如下的连接字符串Data Source=(local); Init Catalog=students; Integrated Security=SSPI;Integrated Security=SSPI表示连接时使用的验证模式是Windows身份验证模式。 7.Pooling、MaxPool Size和Min Pool Size参数 Pooling参数用来说明在连接到数据源时,是否使用连接池,默认是True。当该值为True时,系统将从适当的池中提取SQLConnectio
19、n对象,或在需要时创建该对象并将其添加到适当的池中。当取值为False时,不使用连接池。 当应用程序连接到数据源或创建连接对象时,系统不仅要开销一定的通信和内存资源,还必须完成诸如建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等任务,因此往往成为最为耗时的操作。 实际上,大多数应用程序仅使用一个或几个不同的连接配置。这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭。为了使打开的连接成本最低,ADO.NET使用称为Pooling(即连接池)的优化方法。 在连接池中,为了提高数据库的连接效率,根据
20、实际情况,预先存放了若干数据库连接对象,这些对象即使在用完后也不会被释放。应用程序不是向数据源申请连接对象,而是向连接池申请数据库的连接对象。另外,连接池中的连接对象数量必须同实际需求相符,空置和满载都对数据库的连接效率不利。 Max Pool Size和Min Pool Size这两个参数分别表示连接池中最大和最小连接数量,默认分别是100和0。根据实际应用适当地取值将提高数据库的连接效率。 8.综合实例 下面通过实例来说明连接字符串的具体含义。如果连接字符串是:Provider= Microsoft.Jet.OleDB.4.0;Data Source=D:login.mdb 则说明数据源的
21、种类是Microsoft.Jet.OleDB.4.0,数据源是D盘下的login.mdb Access数据库,用户名和密码均无。如果连接字符串是:Server= (local); DataBase=Master;Uid =sa;Pwd=;ConnectionTimeout=20 由于没有指定Provider,所以可以看出该连接字符串用于创建SqlConnection对象,连接SQL Server数据库。需连接的SQL Server数据库服务器是local,数据库是Master,用户名是sa,密码为空,而最大连接等待时间是20秒。2.2.3 Connection对象的常用方法 Connectio
22、n类型的对象用来连接数据源。在不同的数据提供者的内部,Connection对象的名称是不同的,在SQL Server Data Provider里叫SqlConnection,而在OLE DB Data Provider里叫OleDbConnection。 下面将详细介绍Connection类型对象的常用方法。 1.构造函数 构造函数用来构造Connection类型的对象。对于SqlConnection类,其构造函数说明如表2-4所示。 表2-4 SqlConnection类构造函数说明函数定义参数说明函数说明SqlConnection() 不带参数创建SqlConnection对象SqlCo
23、nnection(string connectionstring) 连接字符串根据连接字符串,创建SqlConnection对象第1种: String ConnectionString =”server=(local); Initial Catalog =stu; ”;SqlConnection conn=new SqlConnection(); conn.ConnectionString=ConnectionString;conn.Open();第2种 String cnn=”server=(local); Initial Catalog =stu; ”; SqlConnection con
24、n=new SqlConnection(cnn);conn.Open();显然使用第2种方法输入的代码要少一点,但是两种方法执行的效率并没有什么不同,另外,如果需要重用Connection对象去使用不同的身份连接不同的数据库时,使用第一种方法则非常有效。例如:SqlConnection conn=new SqlConnection();conn.ConnectionString=connectionString1;conn.Open();/访问数据库,做一些事情conn.Close();conn.ConnectionString=connectionString2;conn.Open();/访
25、问数据库,做另外一些事情conn.Close();注意:只有当一个连接关闭以后才能把另一个不同的连接字符串赋值给Connection 对象。如果不知道Connection对象在某个时候是打开是关闭时,可以检查Connection对象的State属性,它的值可以是Open,也可以是Closed,这样就可以知道连接是否是打开的。 表2-5说明了OleDbConnection类的构造函数。可以看出,它们和SqlConnection类的构造函数非常相近。表2-5 OleDbConnection类构造函数说明函数定义参数说明函数说明OleDbConnection()不带参数创建OleDbConnecti
26、on对象OleDbConnection(string connectionstring)连接字符串根据连接字符串,创建OleDbConnection对象 2.Open和Close方法Open和Close方法分别用来打开和关闭数据库连接,都不带参数,均无返回值。Open方法:使用ConnectionString所指定的属性设置打开数据库连接Close方法:关闭与数据库的连接,这是关闭任何打开连接的首选方法 3.SqlCommand(OleDbCommand)CreateCommand()方法 SqlCommand(OleDbCommand)CreateCommand()方法用来创建一个Comma
27、nd类型的对象。Command类对象一般用来执行SQL语句,关于Command对象的操作将在2.3节里详细描述。CreateCommand()方法:创建并返回一个与SqlConnection关联的SqlCommand对象ChangeDatabase方法:为打开的SqlConnection更改当前数据库。注意:数据库连接是很有价值的资源,因为连接要使用到宝贵的系统资源,如内存和网络带宽,因此对数据库的连接必须小心使用,要在最晚的时候建立连接(调用Open方法),在最早的时候关闭连接(调用Close方法)。也就是说在开发应用程序时,不再需要数据连接时应该立刻关闭数据连接。这点看起来很简单,要达到这
28、个目标也不难,关键是要有这种意识。2.2.4 Connection对象连接数据源代码示例 以下代码演示使用连接字符串创建数据库连接的一般方式。/连接Access数据库string connStr=Provider= Microsoft.Jet.OleDB.4.0;Data Source=D:login.mdb /根据字符串创建OleDbConnection连接对象OleDbConnection objConnection=new OleDbConnection(strConnect); /打开数据源连接if(objConnection.State=ConnectionState.Closed)
29、objConnection.Open();/使用结束后关闭数据源连接if(objConnection.State=ConnectionState.Open)objConnection.Close();在这段代码里的业务逻辑是: (1)创建连接字符串,从中可以看出Connection对象是使用OleDB类型的Data Provider,连接到D盘下login.mdb的Access数据库中。 (2)根据连接字符串,创建Connection类型的对象,这里用到了OleDbConnection。 (3)打开数据源的连接。 (4)执行数据库的访问操作代码。(5)关闭数据源连接。 完整案例1、利用SQL
30、Server2000建立一个数据库Student,并建立相应的表studentInfo2、用Visual C#2005建立一个基于Window的应用程序,并添加一个按钮,如图下3、双击按钮,自动切换到后台代码编辑文件Form1.cs中,并自动添加了与此按钮的Click事件相关的处理程序button1_Click(object sender, EventArgs e) 4、在Form1.cs文件中添加如下命名空间: using System.Data.SqlClient;5、在事件处理程序button1_Click中添加代码:using System;using System.Collectio
31、ns.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Data.SqlClient;namespace DataBase public partial class Form1 : Form public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) try
32、 SqlConnection conn = new SqlConnection(); /conn.ConnectionString = server=(local);user id=sa; Initial Catalog=Student;pwd=; conn.ConnectionString = server=(local);Initial Catalog=Student;Integrated Security=SSPI; conn.Open(); if (conn.State = ConnectionState.Open) MessageBox.Show(连接已经打开); conn.Clos
33、e(); if (conn.State = ConnectionState.Closed) MessageBox.Show(连接已经关闭); catch (Exception ex) MessageBox.Show(数据库连接失败 + ex.Message);2.3 Command(数据命令)对象与查询语句建立了数据库连接之后,就可以执行数据访问操作和数据操纵操作了。一般对数据库的操作被概括为CRUDCreate、Read、Update和Delete。ADO.NET中定义了Command类去执行这些操作。和Connection对象类似,在.NET中存在SqlCommand和OleDbComma
34、nd,除了OleDbCommand类没有ExecuteXmlReader方法之外,OleDbCommand与SqlCommand非常类似。 Command对象主要用来执行SQL语句。利用Command对象,可以查询数据和修改数据。 Command对象是由Connection对象创建的,其连接的数据源也将由Connection来管理。而使用Command对象的SQL属性获得的数据对象,将由DataReader和DataAdapter对象填充到DataSet里,从而完成对数据库数据操作的工作。2.3.1 Command对象的常用属性 Command对象的常用属性有Connection、Connec
35、tionString、CommandType、CommandText和CommandTimeout。 1.Connection属性 Connection属性用来获得或设置该Command对象的连接数据源。比如某SqlConnection类型的conn对象连在SQL Server服务器上,又有一个Command类型的对象cmd,可以通过cmd.Connection=conn来让cmd在conn对象所指定的数据库上操作。 不过,通常的做法是直接通过Connection对象来创建Command对象,而Command对象不宜通过设置Connection属性来更换数据库,所以上述做法并不推荐。 2.Co
36、nnectionString属性 ConnectionString属性用来获得或设置连接数据库时用到的连接字符串,用法和上述Connection属性相同。同样,不推荐使用该属性来更换数据库。 3.CommandType属性 CommandType属性用来获得或设置CommandText属性中的语句是SQL语句、数据表名还是存储过程。该属性的取值有3个: 如果把CommandType设置成为Text或不设置,说明CommandText属性的值是一个SQL语句。 如果把CommandType设置成为TableDirect,说明CommandText属性的值是一个要操作的数据表的名。(SQL Ser
37、ver.NET数据提供程序不支持该属性值)如果把CommandType设置成为StoredProcedure,说明CommandText属性的值是一个存储过程。如果不显示设置CommandType的值,则CommandType默认为Text。 表 CommandType枚举值值说明StoredProcedure指示CommandType属性的值为存储过程的名称 TableDirect指示CommandType属性的值为一个或多个表的名称只有OLE DB的.NET Framework数据提供程序才支持TableDirect Text指示CommandType属性的值为SQL文本命令(默认)Str
38、ing cnstr=Sever=(local); database=student; Integrated Security=true;SqlConnection conn=new SqlConnection(cnstr);conn.Open();SqlCommand cmd=new SqlCommand(select * from Student, conn); 4.CommandText属性 根据CommandType属性的不同取值,可以使用CommandText属性获取或设置SQL语句、数据表名(仅限于OLE DB数据库提供程序)或存储过程。2.3.2 Command对象的常用方法 同样
39、,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Server Data Provider里叫SqlCommand,而在OLE DB Data Provider里叫OleDbCommand。 下面将详细介绍Command类型对象的常用方法,包括构造函数、执行不带返回结果集的SQL语句方法、执行带返回结果集的SQL语句方法和使用查询结果填充DataReader对象的方法。 1.构造函数构造函数用来构造Command对象。对于SqlCommand类型的对象,其构造函数说明如表 2-6所示。表2-6 SqlCommand类构造函数说明函数定义 参数说明函数说明SqlComman
40、d() 不带参数创建SqlCommand对象SqlCommand(string cmdText) cmdText: SQL 语句字符串根据SQL语句字符串,创建SqlCommand对象 SqlCommand(string cmdText, SqlConnection connection)cmdText: SQL 语句字符串connection: 连接到的数据源根据数据源和SQL语句,创建SqlCommand对象SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction)cmdText: SQL
41、语句字符串connection: 连接到的数据源transaction: 事务对象根据数据源和SQL语句和事务对象,创建SqlCommand对象(1) 第一个构造函数不带任何参数 SqlCommand cmd=newe SqlCommand(); cmd.Connection=ConnectionObject; cmd.CommandText=CommandText;上面代码段使用默认的构造函数创建一个SqlCommand对象。然后,把已有的Connection对象ConnectionObject和命名文本CommandText分别赋给了Command对象的Connection属性和Comma
42、ndText属性。 例如,CommandText可以从数据库检索数据的SQL select语句: string CommandText= select *from studentInfo ;除此之外,许多关系型数据库,例如SQL Server 和Oracle,都支持存储过程。可以把存储过程的名称指定为命名文本。例如,使用编写 GetAllStudent存储过程为命名文本:string CommandText= GetAllStudent ;cmd.CommandType=CommandType.StoredProcedure;(2) 第二个构造函数可以接受一个命令文本 SqlCommand c
43、md=newe SqlCommand(CommandText); cmd.Connection=ConnectionObject;上面的代码实例化了一个Command对象,并使用给定命令文本对Command对象的CommandText属性进行了初始化。然后,使用已有的Connection 对象对Command对象的Connection属性进行了赋值。(3) 第三个构造函数接受一个Connection和一个命名文本 SqlCommand cmd=newe SqlCommand(CommandText, ConnectionObject);注意这两个参数的顺序,第一个为string类型的命令文本,
44、第二个为Connection对象。(4) 第四个构造函数接受三个参数,第三个参数是SqlTransaction对象,这里不做讨论。另外,Connection 对象提供了CreateCommand方法,该方法将实例化一个Command对象,并将其Connection属性赋值为建立该Command对象的Connection对象。无论在什么情况下,当把Connection对象赋值给Command对象的Connection属性时,并不需要Connection对象是打开的。但是,如果连接没有打开,则在命令执行之前必须首先打开连接。 而对于OleDbCommand类型的对象,其构造函数如2-7所示。同样可
45、以看出,它们和SqlCommand类的构造函数非常相似。表2-7 OleDbCommand类构造函数说明 函数定义参数说明函数说明OleDbCommand()不带参数创建OleDbCommand对象OleDbCommand(string cmdText)cmdText: SQL语句字符串根据SQL语句字符串,创建OleDbCommand对象OleDbCommand(string cmdText,OleDbConnection connection)cmdText: SQL语句字符串connection:连接到的数据源根据数据源和SQL语句,创建OleDbCommand对象OleDbCommand(stringcmdText, OleDbConnection connection ,OleDbTransaction trans