ADO.NET数据访问技术
大家好,我是小雨,今天给大家讲的主要内容是:
1,ADO.NET基础
2,连接模式数据库访问
3,断开模式数据库访问
=============================
首先我们来看看第一个内容,ADO.NET基础
ADO.NET模型
ADO.NET的组件
ADO.NET的数据访问模式
我们先来看两幅图
数据集DataSet位于System.Data命名空间下,用于在内存中暂存数据,可以把它看成是内存中的小型数据库。DataSet包含一个或多个数据表(DataTable),表数据可来自数据库、文件或XML数据。
DataSet一旦读取到数据库中的数据后,就在内存中建立数据库的副本,在此之后的所有操作都是在内存中的DataSet中完成,直到执行更新命令为止。
在ADO.NET中,连接数据源有4种数据提供程序。如果要在应用程序中使用任何一种数据提供程序,必须在后台代码中引用对应的命名空间,类的名称也随之变化。
下面我们再说说第二个问题,连接模式数据库访问
1,使用SqlConnection对象连接数据库
2,使用SqlCommand对象执行数据库命令
3,使用SqlDataReader读取数据
4,为SqlCommand传递参数
5,使用SqlCommand执行存储过程
6,使用事务处理
==============================
连接模式访问数据库的开发流程有以下几个步骤:
创建SqlConnection对象与数据库建立连接;
创建SqlCommand对象对数据库执行SQL命令或存储过程,包括增、删、改及查询数据库等命令;
如果查询数据库的数据,则创建SqlDataReader对象读取SqlCommand命令查询到的结果集,并将查到的结果集绑定到控件上。
使用SqlConnection对象连接数据库
操作数据库的第一步是建立与数据库的连接,因此首先要创建SqlConnection对象。要创建SqlConnection对象必须先了解SqlConnection对象的常用属性和方法。
更多计算机学习资料详情访问:http://itbook.taobao.com/
这是本人的淘宝店铺,欢迎大家前来购书。
ConnectionString属性通常包含以下参数,各参数间用“;”分隔。
Provider:用于设置数据源的OLE DB驱动程序。如:Access为“Microsoft.Jet.OLEDB.4.0”;SQL Server 6.5或之前版本为“SQLOLEDB”。
Data Source:设置数据源的实际路径。
Password:设置登录数据库所使用的密码。
User ID:设置登录数据库时所使用的帐号。
例如,连接Access数据库的的连接参数为:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\abc.mdb
对于SQL7.0或更高版本的SQL数据库,ConnectionString属性包含的主要参数有:
Data Source或Server:设置需连接的数据库服务器名称。
Initial Catalog或Database:设置连接的数据库名称。
AttachDBFilename:数据库的路径和文件名。
User ID 或 uid:登录SQL Server数据库的账户。
Password 或 pwd:登录SQL Server数据库的密码。
Integrated Security:是否使用Windows集成身份验证,值有三种:true、false和SSPI,true和SSPI表示使用Windows集成身份验证。
Connection Timeout:设置SqlConnection对象连接SQL数据库服务器的超时时间,单位为秒,若在所设置的时间内无法连接数据库,则返回失败信息。默认为15秒。
连接数据库时,有两种验证模式:
混合验证模式
Windows集成验证模式
使用混合验证模式的连接参数为:
Data Source =localhost; Initial Catalog=northwind; User Id=sa;pwd=123
其中,Data Source =localhost表示连接本机SQL数据库的默认服务器。
使用Windows集成验证模式的连接参数为:
Data Source =localhost; Initial Catalog=northwind; Integrated Security=true
混合验证模式必须在连接字符串中以明文形式保存用户名和密码,因此安全性较差。Windows集成验证模式不发送用户名和密码;仅发送用户通过身份验证的信息。从安全角度考虑,建议使用Windows集成验证模式。
例如:Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Student.mdf;
Integrated Security=True;User Instance=True
其中,Data Source=.\SQLEXPRESS表示SQL Server2005的SQLEXPRESS数据库服务器,AttachDbFilename表示数据库的路径和文件名,|DataDirectory|表示网站默认数据库路径App_Data。
SqlConnection对象的常用方法
在创建数据库连接对象时,需要指定连接字符串。通常有以下2种方法获取连接字符串:
创建连接对象,并在应用程序的中硬编码连接字符串。
SqlConnection 对象名称 = new SqlConnection("连接字符串");
或
SqlConnection 对象名称 = new SqlConnection( );
对象名称. ConnectionString="连接字符串";
把连接字符串放在应用程序的web.config文件中,再引用web.config文件。
在web.config配置文件的<configuration>节中添加如下的代码。
<connectionStrings>
<add name="StudentCnnString"
connectionString="Data Source=.\SQLEXPRESS;
AttachDbFilename=|DataDirectory|\Student.mdf;
Integrated Security=True; User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
web.config文件中有了连接字符串后,就可以从web.config中读取连接字符串。
需要使用System.Configuration.ConfigurationManager类读取连接字符串。代码如下:
string strCnn= ConfigurationManager.ConnectionStrings
["StudentCnnString"].ConnectionString;
//读取连接字符串
SqlConnection cnn = new SqlConnection(strCnn);
//定义连接对象
为了使上述代码正常工作,必须使用
using System.Configuration语句引入命名空间。
创建好SqlConnection连接对象后,并没有与数据库建立连接,要建立数据库连接,还必须使用cnn.Open()方法打开数据连接,然后才可以对数据库进行各种操作。操作完数据库后,一定要使用cnn.Close()方法关闭连接。
使用SqlCommand对象执行数据库命令
成功连接数据库后,接着就可以使用SqlCommand对象对数据库进行各种操作,如读取、写入、修改和删除等操作
建立SqlCommand对象的方法有4种:
SqlCommand 对象名 = new SqlCommand();
SqlCommand 对象名 = new SqlCommand("SQL命令");
SqlCommand 对象名= new SqlCommand("SQL命令" , 连接对象);
SqlCommand 对象名= new SqlCommand("SQL命令" , 连接对象 , 事务对象);
SqlCommand对象的常用方法
1.ExecuteNonQuery方法
ExecuteNonQuery方法只能执行Insert、Update和Delete命令,因此可以增加、修改和删除数据库中的数据。增加、修改和删除数据库中的数据的步骤相同,具体描述如下:
创建SqlConnection对象,设置连接字符串;
创建SqlCommand对象,设置它的Connection和CommandText属性,分别表示数据库连接和需要执行的SQL命令。
打开与数据库连接;
使用SqlCommand对象的ExecuteNonQuery方法执行CommandText中的命令;并根据返回值判断是否对数据库操作成功。
关闭与数据库连接;
2. ExecuteScalar方法
ExecuteScalar方法一般用来执行查询单值的Select命令,它以object类型返回结果表第一行第一列的值。对数据库操作时,具体步骤如下:
创建SqlConnection对象,设置连接字符串;
创建SqlCommand对象,设置它的Connection和CommandText属性;
打开与数据库连接;
使用SqlCommand对象的ExecuteScalar方法执行CommandText中的命令;并返回结果表第一行第一列的值供应用程序使用。
关闭与数据库连接;
使用SqlDataReader读取数据
SqlDataReader对象是一个向前只读的记录指针,用于快速读取数据。对于只需要顺序显示数据表中记录的应用而言,SqlDataReader对象是比较理想的选择。
在读取数据时,它需要与数据源保持实时连接,以循环的方式读取结果集中的数据。这个对象不能直接实例化,而必须调用SqlCommand对象的ExecuteReader方法才能创建有效的SqlDataReader对象。SqlDataReader对象一旦创建,即可通过对象的属性、方法访问数据源中的数据。
SqlDataReader对象的常用属性:
FieldCount:获取由SqlDataReader得到的一行数据中的字段数。
isClosed:获取SqlDataReader对象的状态。true表示关闭,false表示打开。
HasRows:表示SqlDataReader是否包含数据。
SqlDataReader对象的常用方法:
Close()方法:不带参数,无返回值,用来关闭SqlDataReader对象。
Read()方法:让记录指针指向本结果集中的下一条记录,返回值是true或false。
NextResult()方法:当返回多个结果集时,使用该方法让记录指针指向下一个结果集。当调用该方法获得下一个结果集后,依然要用Read方法来遍历访问该结果集。
GetValue(int i)方法:根据传入的列的索引值,返回当前记录行里指定列的值。由于事先无法预知返回列的数据类型,所以该方法使用Object类型来接收返回数据。
GetValues (Object[] values)方法:该方法会把当前记录行里所有的数据保存到一个数组里。可以使用FieldCount属性来获知记录里字段的总数,据此定义接收返回值的数组长度。
GetDataTypeName(int i)方法:通过输入列索引,获得该列的类型。
GetName(int i)方法:通过输入列索引,获得该列的名称。综合使用GetName和GetValue两方法,可以获得数据表里列名和列的字段。
IsDBNull(int i)方法:判断指定索引号的列的值是否为空,返回True或False。
使用SqlDataReader对象查询数据库的一般步骤:
创建SqlConnection对象,设置连接字符串;
创建SqlCommand对象,设置它的Connection和CommandText属性,分别表示数据库连接和需要执行的SQL命令。
打开与数据库连接;
使用SqlCommand对象的ExecuteReader方法执行CommandText中的命令;并把返回的结果放在SqlDataReader对象中。
通过循环,处理数据库查询结果。
关闭与数据库连接;
使用SqlDataReader对象时,应注意以下几点:
读取数据时,SqlConnection对象必须处于打开状态。
必须通过SqlCommand对象的ExecuteReader()方法,产生SqlDataReader对象的实例。
只能按向下的顺序逐条读取记录,不能随机读取。且无法直接获知读取记录的总数。
SqlDataReader对象管理的查询结果是只读的,不能修改。
在Visual Studio 的Web应用程序中,提供了大量列表绑定控件,如DropDownList、ListBox和GridView控件等,可以直接将SqlDataReader对象绑定到这些控件来显示查询结果。与控件绑定时,主要设置控件的以下属性和方法:
DataSource属性:设置控件的数据源,可以是SqlDataReader对象,也可以是DataSet对象。
DataMember属性:当数据源为DataSet对象时,设置控件要显示的数据表名。
DataTextField属性:对于绑定DropDownList、ListBox等控件时,设置显示数据的字段名称。
DataValueField属性:对于绑定DropDownList、ListBox等控件时,设置隐藏值的字段名称。
DataBind方法:设置完控件的绑定属性后,调用该方法将数据绑定到控件上。
使用SqlCommand执行存储过程
存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。对于大中型的应用程序中,使用存储过程具有下列优点:
一次创建和测试好后,可以多次供应用程序调用
数据库人员和Web应用程序开发人员可以独立地工作,简化了分工。
Web应用程序和开发人员不直接访问数据库,提高了数据库的安全性。
存储过程在创建时即在服务器上进行预编译,因此具有较高的执行效率。
一个存储过程可以执行上百条SQL语句,降低网络通信量。
存储过程或数据库结构的更改不会影响应用程序,具有一定的灵活性。
存储过程按返回值的情况,同样分为3种:返回记录的存储过程;返回单个值的存储过程;执行操作的存储过程。使用SqlCommand对象执行存储过程与执行SQL语句一样,分为以下3种情况。
返回记录的存储过程:使用SqlCommand对象的ExecuteReader方法执行,并从数据库中获取查询结果集。
返回标量值的存储过程:使用SqlCommand对象的ExecuteScalar方法执行,并从数据库中检索单个值
执行操作的存储过程:使用SqlCommand对象的ExecuteNoQuery方法执行,并返回受影响的记录数。
使用事务处理
在.Net中,事务处理机制共有4种:
数据库事务
ADO.NET事务
ASP.NET事务
企业服务级事务
断开模式数据库访问
DataSet数据集
使用SqlDataAdapter对象执行数据库命令
断开模式访问数据库的开发流程有以下几个步骤:
创建SqlConnection对象与数据库建立连接;
创建SqlDataAdapter对象对数据库执行SQL命令或存储过程,包括增、删、改及查询数据库等命令;
如果查询数据库的数据,则使用SqlDataAdapter的Fill方法填充DataSet;如果是对数据库进行增、删、改操作,首先要对DataSet对象进行更新,然后使用SqlDataAdapter的Update方法将DataSet中的修改内容更新到数据库中。使用SqlDataAdapter对数据库的操作过程中,连接的打开和关闭是自动完成的,无需手动编码。
DataSet数据集
DataSet是ADO.NET的核心组建之一,位于System.Data命名空间下,是一个内存中的小型数据库。
数据集是包含数据表的对象,可以在这些数据表中临时存储数据以便在应用程序中使用。
如果应用程序要求使用数据,则可以将该数据加载到数据集中,数据集在本地内存中为应用程序提供了待用数据的缓存。即使应用程序从数据库断开连接,也可以使用数据集中的数据。
数据集维护有关其数据更改的信息,因此可以跟踪数据更新,并在应用程序重新连接时将更新发送回数据库。
数据集可以分为类型化和非类型化两种数据集。
类型化数据集是继承自DataSet类,通过“数据集设计器”创建一个新的强类型数据集类。其架构信息如表、行、列等都已内置。由于类型化数据集继承自DataSet类,因此类型化数据集具有DataSet类的所有功能。
非类型化数据集没有相应的内置架构。与类型化数据集一样,非类型化数据集也包含表、列等,但它们只作为集合公开。
1.数据集(DataSet)对象创建
创建DataSet的语法格式为:
DataSet 对象名 = new DataSet();
或
DataSet 对象名 = new DataSet("数据集名");
例如,创建数据集对象dsStu,代码如下:
DataSet dsStu = new DataSet();
或
DataSet dsStu = new DataSet("Student");
2.数据表(DataTable)对象的创建
DataSet中的每个数据表都是一个DataTable对象。定义DataTable对象的语法格式为:
DataTable 对象名 = new DataTable();
或
DataTable 对象名 = new DataTable("数据表名");
例如,创建数据表对象dtStu,代码如下:
DataTable dtStuInfo = new DataTable();
dtStuInfo.TableName="StuInfo";
或
DataTable dtStuInfo = new DataTable("StuInfo");
创建好的数据表对象,可以添加到数据集对象中,代码如下:
dsStu.Tables.Add(dtStuInfo);
3.数据列(DataColumn)对象的创建
DataTable对象中包含多个数据列,每列就是一个DataColumn对象。定义DataColumn对象的语法格式为:
DataColumn 对象名 = new DataColumn();
或
DataColumn 对象名 = new DataColumn("字段名");
或
DataColumn 对象名 = new DataColumn("字段名",数据类型);
例如,创建数据列对象stuNoColumn,代码如下:
DataColumn stuNoColumn= new DataColumn();
stuNoColumn.ColumnName=" StuNo";
stuNoColumn.DataType =System.Type.GetType("System.String");
或
DataColumn stuNoColumn= new DataColumn("StuNo",
System.Type.GetType("System.String"));
说明:通过DataColumn对象的DataType属性设置字段数据类型时,不可直接设置数据类型,而要按照以下语法格式:
对象名.DataType = System.Type.GetType("数据类型"));
创建好的数据列对象,可以添加到数据表对象中,代码如下:
dtStuInfo.Columns.Add(stuNoColumn);
4.数据行(DataRow)的创建
DataTable对象可以包含多个数据列,每行就是一个DataRow对象。定义DataRow对象的语法格式为:
DataRow 对象名 = DataTable对象.NewRow();
注意:DataRow对象不能用New来创建,而需要用数据表对象的NewRow方法创建。
例如,为数据表对象dtStu添加一个新的数据行,代码如下:
DataRow dr = dtStuInfo.NewRow();
访问一行中某个单元格内容的方法为:
DataRow对象名["字段名"]或DataRow对象名[序号]
5.视图对象(DataView)的创建
数据视图DataView是一个对象,它位于数据表上面一层,提供经过筛选和排序后的表视图。通过定制数据视图可以选择只显示表记录的一个子集,同时在一个数据表上可定义多个DataView。
定义DataView对象的语法格式为:
DataView 对象名= new DataView(数据表对象);
例如:
DataView dvStuInfo = new DataView(dtStuInfo);
DataView对象可以通过以下2个属性定制不同的数据视图。
RowFilter属性:设置选取数据行的筛选表达式。
Sort属性:设置排序字段和方式。
例如:
DataView dvStuInfo = new DataView (ds.Tables("StuInfo"));
dvStuInfo.Sort = "StuNo desc"; //按StuNo字段降序排,如果要升序,将desc改为asc
dvStuInfo.RowFilter = "Name = '张三'";//筛选出姓名为张三的学生
6.类型化的数据集
创建类型化的数据集有多种方法,下面介绍如何使用“数据集设计器”创建数据集。
在“解决方案资源管理器中”,鼠标右键单击项目名称,选择“添加新项”菜单。
从“添加新项”对话框中选择“数据集”。
键入该数据集的名称。
单击“添加”按钮。Visual Studio 会提示把强类型数据集放到App_Code目录中,选择“是”按钮。数据集将添加到项目的App_Code目录下,并打开“数据集设计器”。
可以从“工具箱”的“数据集”选项卡中拖数据表等控件到设计器上,设计相应的数据集,该数据集存储在.xsd文件中。
下面将非类型化数据集与类型化数据集比较,类型化数据集有以下两个优势。
类型化数据集的架构信息已经预先“硬编码”到数据集内。也就是说,数据集按将要获取的数据的表、列以及数据类型预先初始化了。这样,执行查询获取实际信息时会稍微快一些,因为数据提供程序分两步填充空DataSet。它首先获取最基础的架构信息,然后再执行查询。
可以通过类型化数据集的属性名称而不是基于字段查找的方式访问表和字段的值。这样,如果使用了错误的表名、字段名或数据类型,就可以在编译时而不是运行时捕获错误。
例如,要访问StuInfo表的第i行Name字段的值,非类型化数据集的方法是dsStu.Tables["StuInfo"].Rows[i]["Name"];类型化的数据集的方法是dsStu.StuInfo[i].Name。
DataAdapter是一个特殊的类,其作用是数据源与DataSet对象之间沟通的桥梁。
DataAdapter提供了双向的数据传输机制,它可以在数据源上执行Select语句,把查询结果集传送到DataSet对象的数据表(DataTable)中,还可以执行Insert、Update和Delete语句,将DataTable对象更改过的数据提取并更新回数据源。
DataAdapte对象包含四个常用属性:
SelectCommad属性:是一个Command对象,用于从数据源中检索数据。
InsertCommand、UpdateCommand和DeleteCommand属性:也是Command对象,用于按照对DataSet中数据的修改来管理对数据源中数据的更新。
DataAdapter对象的常用方法:
Fill方法:调用Fill方法会自动执行SelectCommand属性中提供的命令,获取结果集并填充数据集的DataTable对象。其本质是通过执行SelectCommand对象的Select语句查询数据库,返回DataReader对象,通过DataReader对象隐式地创建DataSet中的表,并填充DataSet中表行的数据。
Update方法:调用InsertCommand、UpdateCommand和DeleteCommand属性指定的SQL命令,将DataSet对象更新到相应的数据源。在Update方法中,逐行检查数据表每行的RowState属性值,根据不同的RowState属性,调用不同的Command命令更新数据库。DataAdapter对象更新数据库示例图如图所示。
定义SqlDataAdapter对象的方法有4种:
SqlDataAdapter对象名= new SqlDataAdapter();
SqlDataAdapter 对象名 = new SqlDataAdapter(SqlCommand对象);
SqlDataAdapter 对象名 = new SqlDataAdapter("SQL命令", 连接对象);
SqlDataAdapter 对象名 = new SqlDataAdapter("SQL命令", 连接字符串);
例如:
SqlDataAdapter daStu = new SqlDataAdapter("select * from StuInfo", cnn);
1、使用SqlDataAdapter对象查询数据库的数据
使用SqlDataAdapter查询数据库的步骤为:
创建数据库连接对象;
利用数据库连接对象和Select语句创建SqlDataAdapter对象;
使用SqlDataAdapter对象的Fill方法把Select语句的查询结果放在DataSet对象的一个数据表中或直接放在一个DataTable对象中;
查询DataTable对象中的数据
2、使用SqlDataAdapter对象增/删/改数据库的数据
使用SqlDataAdapter查询数据库的步骤为:
创建数据库连接对象。
利用数据库连接对象和Select语句创建SqlDataAdapter对象。
根据操作要求配置SqlDataAdapter对象中不同的Command属性。如增加数据库数据,需要配置InsertCommand属性;修改数据库数据,需要配置UpdateCommand属性;删除数据库数据,需要配置DeleteCommand属性。
使用SqlDataAdapter对象的Fill方法把Select语句的查询结果放在DataSet对象的一个数据表中或直接放在一个DataTable对象中。
对DataTable对象中的数据进行增、删、改操作。
修改完成后,通过SqlDataAdapter对象的Update方法将DataTable对象中的修改更新到数据库。