数据库连接讲义.docx
《数据库连接讲义.docx》由会员分享,可在线阅读,更多相关《数据库连接讲义.docx(29页珍藏版)》请在冰豆网上搜索。
数据库连接讲义
数据库连接
目标:
熟练掌握connection,Command,DataReader,DataSet类进行数据库连接.
重点:
数据读取器,和数据集的使用.
难点:
数据集数据的填充.
一ADO.net概述
ADO.NET是新一代MicrosoftActiveX数据对象(ADO),它是一种应用程序编程界面(API),可用来创建分布式的数据共享应用程序。
尽管ADO.NET保留了以前的ADO模型的一些主要概念,但其功能已大大增强,可用来访问来自各种数据源的结构化数据。
ADO.NET使用XML在程序之间或者与Web页交换数据。
可在需要连接到、传送、检索、操纵和更新任何符合OLEDB数据源(如MicrosoftSQLServer)数据的客户应用程序中使用ADO.NET。
应用程序还可使用OLEDB访问以非关系格式存储的数据,如MicrosoftExcel。
目前对管理信息系统的开发设计主要有C/S和B/S两种结构,下面对两种结构进行一下简单的比较[2]。
运用C/S结构,采用PB、Delphi或VB等技术来开发。
操作系统采用Windows2000,数据库软件使用Oracle数据库,C/S又称Client/Server或客户/服务器模式。
服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle,Sybase,Informix或SQLServer。
客户端需要安装专用的客户端软件。
C/S结构的数据库管理系统,如图2.1所示。
图2.1C/S结构图
即一般用户在客户端上操作时,客户端向服务器端数据库提出请求。
这时,服务器发出响应;客户端收到响应后,开始执行任务。
数据库管理员在服务器端上利用管理平台管理和维护数据库。
B/S是Browser/Server的缩写,客户机上只要安装一个浏览器(Browser),如NetscapeNavigator或InternetExplorer,mxhon,服务器安装Oracle,Sybase,Informix或SQLServer等数据库。
浏览器通过WebServer同数据库进行数据交互。
B/S结构原理如图2.2所示,多数页面都是通过ASP脚本程序直接访问数据库和文件系统,有部分ASP程序通过组件(上传组件)访问数据库和文件系统
图2.2B/S结构系统工作原理图
下面讨论ADO.net的一些特性:
与ADO的相似点
创建ADO.net是为了满足当今应用程序发展的需要。
同时,它还必须尽量与ADO保持相似,以便使目前的ADO编程人员不会感到难以从ADO迁移到ADO.net。
ADO.net与.net框架完全集成,因此对ADO编程人员来说,不会感到十分陌生。
使用数据集(DataSet)
数据集是ADO.net的一个重要组件。
数据集是数据库在内存中的一个副本。
它包含许多表,这些表反过来又与数据库中的表和视图进行通信。
它位于内存中,与数据库之间没有活动连接。
可将数据集描述为数据库数据的一个非连接快照。
这种结构提高了可伸缩性,因为只有需要读取或写入数据库时才使用数据集。
XML支持
XML如今正在成为一种事实标准。
ADO.net在很基础的层次支持XML.net和ADO.net中的XML类的框架具有相同的结构。
交互式提问
ADO和ADO.net有哪些相同点和不同点?
ADO.NET是对ADO的改进。
快速了解ADO.NET优点的一种途径就是对比它和ADO的功能。
功能
ADO
ADO.net
内存驻留的数据表示
使用RecordSet对象,看起来像一个表。
使用DataSet对象,该对象可包含一个或多个由DataTable对象表示的表。
多个表间的关系
需要使用JOIN查询将多个数据库表中的数据组合到单个结果表中。
支持DataRelation对象,该对象可将一个DataTable对象中的行与另一个DataTable对象中的行关联起来。
数据访问
顺序扫描数据集行。
使用导航范例实现对表中数据行的非顺序访问。
根据关系从一个表的数据行导航到另一个表的对应行。
非连接访问
由记录集提供,但通常支持由Connection对象表示的连接访问。
通过调用OLEDB提供程序与数据库进行通信。
通过对DataSetCommand对象的标准调用与数据库进行通信,DataSetCommand对象与OLEDB提供程序通信(或有时直接与数据库管理系统提供的API通信)。
可编程能力
使用Connection对象传输说明数据源和基础数据结构的命令。
使用XML的严格类型化编程特性。
数据是自描述的,因为代码项的名称与代码所解决的“现实世界”问题相对应。
基础数据结构(如表、行)不显示,因而使代码更容易读取和写入。
在层或组件之间共享非连接数据
使用COM封送处理传输非连接的记录集。
此方法仅支持COM标准定义的那些数据类型。
需要类型转换,会占用系统资源。
用XML文件传输数据集。
XML格式对数据类型没有限制,也不要求进行类型转换。
穿越防火墙传输数据
有问题,因为防火墙通常被配置为阻止系统级请求,如COM封送处理。
支持,因为ADO.NET的DataSet对象使用基于HTML的XML,可穿越防火墙。
可伸缩性
持续时间很长的数据库锁和活动数据库连接竞争有限的数据库资源。
对数据库数据的非连接访问无需长时间保留数据库锁或活动数据库连接,因此减轻了对有限的数据库资源的竞争。
一个数据提供的程序包含四个主要对象:
Connection对象:
用于连接数据源.
Command对象:
对数据源执行命令.
DataReader对象:
在只读和只进的连接模式下从数据源读取数据.
DataAdataper对象:
从数据源读取数据并且使用读取的数据填充数据集DataSet对象.
10.5数据库操作
数据库操作的主要是执行命令(如插入,更新或删除记录)和读取数据.
10.5.1连接
要访问数据库,首先必须与数据库建立连接提供的Connection对象,用于建立与特定数据库的连接.
例如:
建立sqlserver服务器上xsgl数据库建立连接的代码如下:
stringcnStr=”Password=sa;PersistSecurityInfo=True;UserID=sa;”+”InitialCatalog=xsgl;DataSource=B402”;//服务器名称.
SqlConnectioncn=newSqlConnection();
cn.ConnectionString=cnStr;
cn.open();
注意:
ConnectionString属性是Connection对象最重要的一个属性,他用来指定与数据库建立连接时使用的连接串,连接串包含有源数据库的名称和建立初始连接所需的其他参数,例如用户名和密码这些信息.
连接串的基本格式是包括一系列由分号分隔的关键字/值对.等号(=)连接各个关键字以及其值.关键字不区分大小写
下面介绍一种获得数据库连接串的简单方法:
(1)首先创建一个文本文件,将其扩展名改为“udl”;
(2)双击该文件图标,打开如图所示的数据库连接对话框
(3)在提供程序里选择某个提供者,单击下一步按扭。
(4)选项卡中输入数据库名称,用户名,密码等信息,单击测试连接,看是否成功。
(5)如果测试成功,关闭该对话框,使用记事本再次打开该文件,其中包含有连接串的信息。
注意:
由于SqlConnection对象是专门针对SQLServer数据库的,他的连接串中步允许指定Provider属性,因此,对于通过上述方法获得的连接串,需要去掉“Provider=SQLOLEDB.1“,这才是正确的连接串,对于其他的数据提供程序Connection对象,比如:
OleDbConnection对象,则不存在这个问题。
在设置了正确的连接串以后,通过Connection对象的Open()方法即可打开连接,打开连接后,就可以对数据库使用各种命令,例如进行查询,插入,删除,或更新数据的操作。
完成操作后,需要使用Connection对象的Close()方法关闭连接。
关闭连接是必要的,因为大多数数据源只支持有限数目的打开的连接,并且打开的连接占用宝贵的系统资源。
还可以直接通过Connection类的构造函数来指定连接串,
例如:
下面的代码与上面的代码具有完全相同的效果。
stringcnStr=”Password=sa;PersistSecurityInfo=True;UserID=sa;”+”InitialCatalog=xsgl;DataSource=cz”;//服务器名称.
SqlConnectioncn=newSqlConnection(cnStr);
cn.open();
10.5.2命令(还没使用数据集)
ADO.NET提供两种使用数据的基本方式:
(1)使用数据集
(2)直接对数据库进行操作
在数据集模型中,创建要使用的记录放在内存的存储区中,通过使用数据适配器加载该存储区,操作数据,然后可以选择使用数据适配器将更改写回数据库.
还可以直接对数据库进行处理.在此模型中,使用SQL语句和存储过程的名称配置数据命令对象Command,然后执行命令.如果该命令返回一个结果集,则可以使用数据库读取器对象获取某些数据.
在某些情况下不能使用数据集.例如:
如果想要创建诸如表之类的数据库元素,则必须使用命令对象.
命令对象包含对可直接执行的SQL语句或存储过程的引用.命令对象是SqlCommand类以及其他类似类的实例,SqlCommand类进行优化以便用于SQLServer7.0或更高版本.
使用命令对象有两个步骤,首先是构造命令对象,然后是执行命令.
1构造命令对象
在构造命令对象过程中需要指定该命令对象使用的连接,命令文本和命令类型等信息。
如下所示:
stringcnStr=”Password=sa;PersistSecurityInfo=True;UserID=sa;”+”InitialCatalog=xsgl;DataSource=cz”;
SqlConnectioncn=newConnection(cnStr);//cn连接对象
cn.Open();
SqlCommandcmd=newSqlCommand();//cmd命令对象
cmd.Connection=cn;
cmd.CommandText=”SELECT*FROMSTU”;
该段代码要执行的命令是从stu学生表中选择所有行的数据.
Command对象的重要属性.
CommandText
获取或设置要对数据源执行的SQL语句或存储过程.
CommandTimeout
获取或设置在终止执行命令的尝试并生成错误的等待时间.
CommandType
获取或设置一个值,该值指示如何解释CommandText属性.
Connection
获取或设置该命令对象使用的连接(connectiong)对象
请注意:
命令对象的CommandText属性既可以是SQL语句,也可能是存储过程名,那么这里就有一个问题,命令对象如何如何区分给CommandText属性赋的值(类型当然是字符串)是SQL语句,还是存储过程名呢?
在默认的情况下.CommandText属性的值被理解为SQL语句,当然也可以通过设置CommandType的值来指示如何表示CommandText属性.我们是通过CommandType的枚举来表示.例如:
storedProcedure
指示CommandText属性的值为存储过程名称.
Text
指示CommandText属性的值为SQL命令(默认)
也可以直接通过Command类的构造函数来指定命令对象所使用的连接对象和命令文本比如对上面的代码做一下修改.
stringcnStr=”Password=sa;PersistSecurityInfo=True;UserID=sa;”+”InitialCatalog=xsgl;DataSource=cz”;
SqlConnectioncn=newSqlConnection(cnStr);
cn.Open();
SqlCommandcmd=newSqlCommand(“SELECT*FROMSTU”,cn);
2执行命令
命令对象构造完成以后,就可以执行命令对数据库进行操作了.命令对象所提供的用于执行命令的方法有很多种,具体使用那种方法取决于命令的执行结果返回什么样的数据.
下面介绍命令对象的重要方法:
Cancel
用于试图取消命令的执行
ExecuteNonQuery
对连接执行的SQL语句并返回受影响的行数.
ExecuteReader
执行查询并将查询查询结果返回到数据读取器(DataReader)中.
ExecuteScalar
执行查询,并返回查询所返回的结果集中第一行的第一列.
ExecuteXmlReader
执行查询,并将查询结果返回到一个XmlReader对象中.
下面举几个例子,对这几种方法的使用:
ExecuteNonQuery()方法一般用于执行UPDATE,INSERT,DELETE等非查询语句.
stringcnStr=”Password=sa;PersistSecurityInfo=True;UserID=sa;”+”InitialCatalog=xsgl;DataSource=cz”;
SqlConnectioncn=newConnection(cnStr);
cn.Open();
stringsqlStr=”updatestuset姓名=’john’where姓名=’bill’”;
SqlCommandcmd=newSqlCommand(sqlStr,cn);
cmd.ExecuteNonQuery();
cn.Close();
ExecuteNonQuery()方法的返回值是一个整数,代表操作所影响的行数.
ExecuteReader()方法用于执行查询操作,他返回一个DataReader对象,通过该对象可以可以读取所得到的数据.下一节将和同学们讨论DataReader类的对象.
请看下面的代码:
stringcnStr="Password=sa;PersistSecurityInfo=True;UserID=sa;"+"InitialCatalog=xsgl;DataSource=417-52";
SqlConnectioncn=newSqlConnection(cnStr);
cn.Open();
SqlCommandcmd=newSqlCommand("SELECT*FROMSTU",cn);
SqlDataReaderDr=cmd.ExecuteReader();
while(Dr.Read())
{
Stringname=Dr["姓名"].ToString();
Console.WriteLine(name);
}
Dr.Close();
cn.Close();这段代码是将stu表中读取全部数据,并将姓名字段的数据全部输出到控制台上.
在许多情况下:
需要从SQL语句返回一个结果,例如客户表中记录的个数,当前服务器的时间等,ExecuteScalar()方法就适用于这种情况。
下面的代码就是读取数据库中表Customers的记录的个数,并把它输出到控制台上。
usingSystem;
usingSystem.Data.SqlClient;
usingSystem.Data;
namespaceConsoleApplication1
{
///
///Class1的摘要说明。
///
classClass1
{
///
///应用程序的主入口点。
///
[STAThread]
staticvoidMain(string[]args)
{
stringcnStr="password=sa;persistSecurityInfo=True;UserID=sa;"+"InitialCatalog=Northwind;DataSource=772F1959E31B442";
SqlConnectioncn=newSqlConnection(cnStr);
cn.Open();
stringsqlStr="selectcount(*)fromCustomers";
SqlCommandcmd=newSqlCommand(sqlStr,cn);
objectcount=cmd.ExecuteScalar();//ExecuteScalar()方法返回值类型是object,根据具体需要可以将他转化为合适的类型。
Console.WriteLine(count.ToString());
cn.Close();
}
}
}
运行结果:
10.5.3数据读取器
DataReader是从一个数据源中选择某些数据最简单的方法.
DataReader类没有构造函数,所以不能直接实例化他,需要从Command对象中返回一个DataReader实例,具体是通过他们的ExcuteReader方法,下面的代码是将stu表中读取数据并将姓名,学号的所有数据输出到文本框中.
请看下面的代码:
stringcnStr="Password=sa;PersistSecurityInfo=True;UserID=sa;"+"InitialCatalog=xsgl;DataSource=FCFB3F021B7B4E7";//请根据SqlServer的配置,指定连接串中的用户名和密码。
SqlConnectioncn=newSqlConnection(cnStr);
cn.Open();
SqlCommandcmd=newSqlCommand("SELECT*FROMstu",cn);
SqlDataReaderdr=cmd.ExecuteReader();//通过该方法返回SqlDataReader一个实例dr
while(dr.Read())
{
textBox1.Text+=dr[0].ToString()+"\t"+dr[1].ToString()+"\t"+dr[2].ToString()+"\t";
}
dr.Close();
cn.Close();
}
说明:
DataReader是一个只向前的连接光标,即只能沿着一个方向遍历记录,在此过程中数据库一直保持打开状态,否则不能通过DataReader读取数据.在完成数据读取后,需要调用Close()方法关闭DataReader.如果创建DataReader对象时,使用的是ExecuteReader()方法的另一个重载,就会自动关闭DataReader的底层连接,不需要显示的调用Connection对象的Close()方法关闭他.代码如下请看:
SqlDataReadermyDataReader=cmd.ExecuteReader(CommandBehavior.CloseConnection);
DataReader的Read()方法用于读取数据,每执行一次该语句,DataReader就向前读取一行数据,就遇到末尾,就返回末尾false,否则返回true.
DataReader类有一个索引符,可以使用常见的数组语法访问任何字段,使用这种方法既可以通过指定数据列的名称,也可以通过指定数据列的编号来访问特定列的值,第一列的编号是0,第二列的值是1依此类推。
例如:
Objectvalue1=myDataReader[“CategoryId”];
Objectvalue1=myDataReader[0];
说明:
假如CategoryId列是第一列,则上面两条语句的功能是完全相同的,只是后者的速度更快一些。
除了通过索引符访问数据外,DataReader类还有一组类型安全的访问方法可以用于读取指定列的值。
这里介绍一下:
这些方法都是以Get开头的,并且他们的名称具有自我解释性。
例如:
GetInt32(),GetString()等。
这些方法都带有一个整形的参数,用于指定要读取列的编号。
intid=myDataReader.GetInt32(0);
stringname=myDataReader.GetString
(1);
10.6数据集(DataSet)
ADO.net相对于ADO最显著的变化就是数据集了,DataSet是一个数据脱机容器,可以形象地描述为内存中地数据库,数据集的结构类似于关系数据库的结构,他公开表,行和列的分层模型.另外他还包含约束和关系对象等.
10.6.1数据集的介绍
数据集是有一组数据表组成的,数据表类似于数据库中的表,每个数据表都有一些数据列和数据行.除了定义数据外,还可以在数据集中定义表之间的连接,来表示表之间的关系,通常为主从关系.例如一张订单表和订单明细表之间就是主从关系,订单表中的一条记录可能关联到订单明细表中的多条记录,下面是数据集的类层次结构.
.
其中DataSet代表数据集,DataTable代表的是数据表,DataColumn代表数据列,DataRow代表行,Constraint代表的是约束,DataRelation代表的是表之间的主从关系。
.
数据集的基本组成部分具体说明如下:
DataSet类包含数据表的Tables集合和DataRelation对象的relations集合.
DataTable类包含数据行Rows集合,数据列的Columns的集合和数据关系的集合
DataRow类包含RowState属性,该属性的值指示自数据表首次从数据库加载后,行是否以更改以及如何更改的.DataState属性可能值包括Delete,Modified,New,和Unchanged.
10.6.2填充数据集
将外部数据源数据加载到数据集中的过程称为填充数据集,有两种方式:
1使用数据适配器。
2把XML读入数据集。
1使用数据适配器(DataAdapter)
不能通过前面我们介绍的Command对象填充数据集,将数据从数据库加载到数据集的过程需要使用到数据适配器。
那么数据适配器是ADO.Net数据提供程序的一个部分。
数据适配器就好像一个桥梁,用于在数据源和数据集之间交换数据。
使用数据适配器,就可以读取,添加,更新和删除数据源中的记录,为指定每种操作的进行方式,适配器支持四个属性。
SelectCommand:
指定某个命令对象以便从数据存储区检索行。
InsertCommand:
指定某命令对象以便向数据存储区插入行。
UpdateCommand:
指定某命令对象以便修改数据存储区中的行。
DeleteCommand:
指定某命令对象以便从数据存储区删除行.
请看下面的代码,他的功能是将stu中的stuNa