`

ADO.NET

 
阅读更多

 

System.Data包含两个主要命名空间

System.Data.OleDB

System.Data.SQLClient

System.Data.OracleClient

 

ADO.NET支持两种访问数据的模型:无连接模型和连接模型。

无连接模型将数据封装到内存中,然后可以像访问本地关系数据库已压根访问内存中的数据。

连接模型依赖封于逐记录的访问,这种访问要求打开并保持与数据库的连接。

 

 

ADO.NET数据访问步骤

 

第一步:导入的命名空间:连接不同的数据库所采用的对象是不一样的,因此导入的命名空间也不一样

SQL Server/Oracle/Access……

第二步:建立应用程序对数据库的连接

第三步:向数据库发送SQL命令

命令类型

SQL文本

存储过程

命令执行类型

查询命令

数据操作命令

第四步:返回命令执行结果

第五步:用户对返回结果进行处理:将结果显示在用户界面上


 

 

一、连接数据库:Connection对象

1. Connection对象

Connection对象是一个连接对象,主要功能是建立于物理数据库的连接,主要包括4中访问数据库的对象类,也可称为数据提供程序,如下:

SQL Server数据提供程序,位于System.Data.SqlClient命名空间   相对应:SqlConnection  

ODBC数据提供程序,位于System.Data.Odbc命名空间  相对应:OdbcConnection

OLEDB数据提供程序,位于System.Data.OleDb命名空间  相对应:OleDbConnection

Oracle数据提供程序,位于System.Data.OracleClient命名空间  相对应:OracleConnection

   打开连接为:   .Open()   关闭连接为:.Close()

 

2. 连接数据库

以SQL Server数据库为例,如果要连接SQL Server数据库,必须使用System.Data。SqlClient命名空间下的SqlConnection类。

通过using System.Data.SqlClient命名引用命名空间,连接数据库之后,通过调用SqlConnection对象的Open方法打开数据库。通过SqlConnection对象的State属性判断数据库的连接状态。

public overriid ConnectionState State{get;}

属性值:ConnectionState枚举。

ConnectionState枚举的值及说明:

 

枚举值 说明
Broken 与数据库的连接中断。只有在连接打开之后才可能发生这种情况。可以关闭处于在这种状态的连接,再重新打开。
Closed 连接处于关闭状态。
Connectioning 连接对象正在与数据源连接。
Executing 连接对象正在指向命令。
Fetching 连接对象正在检索数据。
Open 连接处于打开状态。

 

 

3. 关闭连接

当对数据库操作完毕后,要关闭与数据库的连接,释放占用的资源。通过调用SqlConnection对象的Close()方法或Dispose()方法关闭与数据库的连接,

这两种方法的区别:

Close()方法用于关闭一个连接。当使用Close()方法关闭连接后,可以再调用Open()方法打开连接,不会产生任何错误。

Dispose()方法比较关闭一个连接,而且还清理连接所占用的资源。如果使用Dispose()方法关闭连接,就不可以在此直接用Open方法打开连接,必须再次重新初始化连接再打开。

 

 

 

二、执行SQL语句:Command对象

1. Command对象

Command对象是一个数据命令对象,主要功能是向数据库发送查询、更新、删除、修改的SQL语句。Command对象主要有以下几种方式:

1. SqlCommand:向SQL Server数据库发送SQL语句,位于System.Data.SqlClient命名空间。

2. OdbcCommand:向使用ODBC公开的数据库发送SQL语句,位于System.Data.Odbc命名空间。有些数据库没有提供相应的连接程序,则可以配置好ODBC连接后,使用OdbcCommand。

3. OleDbCommand:向使用OLEDB公开的数据库发送SQL语句,位于System.Data.OleDb命名空间。例如,Access数据库和MySQL数据库都是OLEDB公开的数据库。

4. OracleCommand:向使用ORACLE公开的数据库发送SQL语句,位于System.Data.OracleClient命名空间。

 

注意:

System.Data.OracleClient命名空间,在默认情况下没有此命名空间,此时,需要将System.Data.OracleClient引入到项目中,引入程序集的方法是在项目名称上单击鼠标右键,在菜单中选择“添加应用”,打开“添加应用”对话框,在该对话框中选择System.Data.OracleClient程序集,单击“确定”按钮,即可将其添加到项目中。

 

2. 设置数据源类型

Command对象有三个重要属性:Connection属性,CommandText属性,CammandType属性。

Connection属性用于设置Sqlcommand使用的SqlConnection。

CommandText属性用于设置要对数据源执行的SQL语句或存储过程。

CammandType属性用于设置知道CommandText的类型。CammandType属性的值是CommandType枚举值,CommandType枚举有3个枚举成员:

StoredProcedure:存储过程的名称。

TableDirect:表的名称。

Text:SQL文本命令。

 

如果要设置数据源的类型,便可以通过设置CommandType属性来说

 

3. 执行SQL语句

几种执行SQL语句的方法。

1. ExecuteNonQuery方法

用于向数据库发送增、删、改命令。

public override int ExecuteNonQuery()

返回值:受影响的行数。

 

说明:

如果想要执行存储过程,应将CommandType属性设置为StoredProcedure,将CommandText属性设置为存储过程的名称。

 

2. ExecuteReader方法

执行SQL语句,并生成一个包含数据的SqlDataReader对象的实例。

public SqlDataReader ExecuteNonQuery()

返回值:一个SqlDataReader对象。

 

例:

SqlCommand cmd = new SqlCommand(strSql,conn); 或者【 SqlCommand cmd = new SqlCommand(); cmd.Connection = conn;cmd.CommandText=strSql;cmd.CommandType=CommandType.Text; 】

SqlDataReader sdr = cmd.ExecuteReader();

while (sdr.Read())

{

  listView1.Items.Add(sdr[1].ToString());

}

 

3.ExecuteScalar()方法

执行SQL语句,返回结果集中的第一行的第一列。

public override Object  ExecuteScalar()

返回值:结果集中第一行的第一列或空引用(如果结果集为空)。

说明:ExecuteScalar方法通常与聚合函数一起使用。

 

 

 

三、读取数据:DataReader对象

DataReader对象是数据读取器对象,提供只读向前的游标,如果只是需要快速读取数据,并不需要修改数据,那么就可以使用DataReader对象进行读取,对于不同的数据库连接,有不同的DataReader类型:

1. 在System.Data.SqlClient命名空间下时,可以调用SqlDataReader类。

2. 在System.Data.Odbc命名空间下时,可以调用OdbcDataReader类。

3. 在System.Data.OleDb命名空间下时,可以调用OleDbDataReader类。

4. 在System.Data.OracleClient命名空间下时,可以调用OracleDataReader类。

 

在使用DataReader对象读取数据时,可以使用ExecuteReader方法,根据SQL语句的结果创建一个SqlDataReader对象。

 

说明:在创建DataRelation时,它首先验证是否可以建立关系。在创建DataRelation和将其添加到
DataRelationCollection(DataSet的DataRelation对象的集合)之间的这段时间,可以对父行或子行进行其他更改。

 

判断查询结果中是否有值

可以通过SqlDataReader对象的HasRows属性获取一个值,该值指示SqlDataReader是否好汉一行或多行,即半段查询结果中是否有值。

public override bool HasRows{get;}

属性值:如果SqlDataReader包含一行或多行,则为true;否则为false。

 

读取数据

如果要读取数据表中的数据。 通过ExecuteReader方法,根据SQL语句创建一个SqlDataReader对象后。调用SqlDataReader对象的Read方法读取数据。Read方法使SqlDataReader前进到下一条记录,SqlDataReader的默认位置在第一条记录前面。因此,必须调用Read方法访问数据。对于每个关联的SqlConnection,一次只能打开一个SqlDataReader,在第一个关闭之前,打开另一个的任何尝试都将失败。

public override bool Read()

调用该方法,则游标向下读取一行数据。

返回值:如果下一条还有数据,则为true;如果下一条没有数据,则为false。

 

在使用玩SqlDateReader对象后,要使用Close方法关闭SqlDataReader对象。

public override void Close()

 

遍历DataReader对象

while(reader.Read())

{

 

}

读取数据

reader.GetXXX(xxx)

GetXXX:表示读取数据的类型。例如:GetString(),GetInt32()

xxx:表示字段名称。

 

例如:

reader.GetString("username")  读取数据select语句返回结果集的当前记录条数的username字段的数据。

 

 

参数化查询

Command对象的属性Parameters是一个集和对象。

Parameters对象的方法

Add():添加参数对象。

Clear():清除上一次使用Parameters时添加的参数对象。在每次使用Parameters之前调用。

 

注意:

在实际使用时,不会每次都创建Command,Parameters等对象。而是每次都重用第一次创建的这些对象。

 

想其中添加SqlParameter对象。

SqlParameter的构造函数有两个参数。第一个是参数的名称,第二个是参数的实际值。

例:

cmd.CommandText="select * from T_Users where UserName=@U and Password=@P";

cmd.Parameters.Clear();

cmd.Parameters.Add(new SqlParameter("U",username));

cmd.Parameters.Add(new SqlParameter("P",password));

int i=Conver.ToInt32(cmd.ExecuteScalar());

 

 

说明:

1. DateReader取得的数据结果集不管多少条,对服务器是没有影响的。

    在读取时,一旦数据库连接断开,就无法再读取数据了。

    原理:DateReader相对于指针(游标),读取数据时,只是移动指针(游标)。

2. DateReader不适合小数据量数据结果。

 

 

 

四、数据适配器:DataAdapter对象

1. DataAdapter对象

DataAdapter对象是一个数据适配器对象,是DataSet与数据源之间的桥梁。DataAdapter对象对象提供了4个属性,实现与数据源之间的互通:

SelectCommand属性:向数据库发生查询SQL语句。

DeleteCommand属性:向数据库发生删除SQL语句。

InsertCommand属性:向数据库发生插入SQL语句。

UpdateCommand属性:向数据库发生更新SQL语句。

使用DataAdapter必须使用响应的Command属性。否则没有意义。可以在构造函数中放入Command对象。

DataAdapter adapler=new DataAdapter(cmd);

 

在对数据库进行操作时,只要将这4个属性设置成相应的SQL语句即可。DataAdapter对象中还有几个主要的方法,具体如下:

 

1. Fill方法用数据填充DataSet。

public int Fill(DataSet dataSet,string srcTable)

dataSet:要用记录和架构填充的DataSet。

srcTable:用于表映射的源表的名称。注意:该参数可选。

返回值:已在DataSet中成功添加或刷新的行数,这不包括受不返回行的语句影响的行。

 

说明:

当创建DataAdapter的实例时,将其读/写数学将设置为初始值,MissingMappingAction数学设置为MissingMappingAction.Passthrough,MissSchemaAction属性设置为MissingSchemaAction.Add。

 

2. Update方法更新数据库时,DataAdpter将调用DeleteCommand,InsertCommand,UpdateCommand属性。

public int Update(DataTable dataTable)

dataTable:用于更新数据源的DataTable。

返回值:DataSet中成功更新的行数。

 

 

实例:

string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串

SqlConnection ConnSql=new SqlConnection (strConn); //Sql链接类的实例化

ConnSql.Open ();//打开数据库

string strSQL="SELECT * FROM 表名1 "; //要执行的SQL语句

SqlDataAdapter da=new SqlDataAdapter(strSQL,ConnSql); //创建DataAdapter数据适配器实例

DataSet ds=new DataSet();//创建DataSet实例

da.Fill(ds,"自定义虚拟表名");//使用DataAdapter的Fill方法(填充),调用SELECT命令

ConnSql.Close ();//关闭数据库

 

 

 

2. 填充DataSet数据集

通过DataAdpter对象的Fill方法填充DataSet数据集,Fill方法使用Select语句从数据源中检索数据。与Select命令关联的Connection对象必须有效,但不需要将其打开。

 

说明:DataSet和DataTable对象从MarshalByValueComponent(实现IComponent并提供可远程控制的组件的基实现)继承而来,并支持用于远程处理ISerializable接口。

 

 

3. 更新数据源

使用DataAdpter对象的Update方法,可以将DataSet中修改过的数据及时地更新到数据库中。在调用Update方法之前,要实例化一个CommandBuilder类,它能自动根据DataAdapter的SelectCommand的SQL语句判断其他的InsertCommand,UpdateCommand和DeleteCommand。这样就不要设置DataAdpter的InsertCommand,UpdateCommand和DeleteCommand属性,直接使用DataAdapter的Update方法来更新DataSet,DataTable或DataRow数组即可。

 

 

 

 

 

五、数据集DataSet对象

1. DataSet对象

DataSet对象就像存放于内存中的小型数据库。它可以包含数据表、数据列、数据行、视图、约束以及关系。

通常DataSet的数据来源于数据库或者XML,为了从数据库中获取数据,需要使用数据适配器(DataAdapter)从数据库中查询数据。

 

创建DataSet对象

DataSet dataset=new DataSet();

 

填充DataSet

SqlAdapter adapter=new SqlAdapter(cmd);

adapter.Fill(dataset);

 

DataSet的Tables属性

Tables属性是DataTable对象的集和。可以使用Tables属性得到DataSet中的表。

DataTable table=dataset.Tables[0];

说明:一般情况下,DataSet中只有一个DataTable。

 

DataTable的Rows属性

Rows属性是DataRow对象的集和。

for(int i=0;i<table.Rows.Count;i++)    //遍历Rows属性。

{

    DataRow row=table.Rows[i];

    string name=Convert.ToString(row["Name"]);

}

Rows.Count表示行数。

table.Rows[i] 表示取得table的第i行。

row["Name"] 表示取得row的Name字段的值。

 

注意:

DataSet是离线式的,占用内存。所以只适合小数据量。大数据量会把内存占满。

 

 

1. 合并DataSet内容

可以使用DataSet的Merge方法将DataSet,DataTable或DataRow数组的内容并入现有的DataSet中。Merge方法将指定的DataSet及其架构与当前的DataSet合并,在此过程中,将根据给定的参数保留或放弃在当前DataSet中的更改并处理不兼容的架构。

 

方法为:Merge(dataSet将合并的数据和架构的dataSet名,preserveChanges是否保留当前DataSet中的更改,missingSchemaAction枚举值之一);

public void Merge(DataSet dataSet,bool preserveChanges,MissingSchemaAction missingSchemaAction )

dataSet:其数据和架构被合并到DataSet中。

preserveChanges:要保留当前DataSet中的更改,则为true,否则为false。

missingSchemaAction: MissingSchemaAction枚举值之一。

MissingSchemaAction枚举成员及说明:

 

枚举成员 说明
Add 添加必须的列以完成架构。
AddWithKey 添加必须的列和主键信息以完成架构,用户可以在每个DataTable上显示设置主键约束。这样确保对与现有记录匹配的传入记录进行更新,而不是追加。
Error 如果缺少指定的列映射,则生产InvalidOperationException。
Ignore 忽略额外列。

 

注意:

当DataSet对象为null时,无法进行合并。

 

 

2. 复制DataSet内容

方法为:Copy   例:DataSet ds1 =ds.Copy();

为了在不影响原始数据的情况下使用数据,或者使用dataset中数据的子集,可以创建DataSet的副本。当复制DataSet时,可以:
创建DataSet的原样副本,其中包含架构、数据、行状态信息和行版本。
创建包含现有DataSet的架构但仅包含已修改行的DataSet。可以返回已修改的所有行或者知道特定的DataRowState。有关行状态的更多信息,可以参加行状态与行版本。
仅复制DataSet的架构(即关系结构),而不复制任何行。可以使用ImportRow将行导入现有的DataTable。

可以使用DataSet对象的Copy方法创建包含架构和数据的DataSet的原样副本。Copy方法的功能是复制知道DataSet的结构和数据。
public DataSet Copy()
返回值:新的DataSet,具有与DataSet相同的结构(表架构,关系和约束)和数据。





弱类型DataSet的缺点
1. 只能通过列名引用,dataset.Table[0].Rows[0].["Age"]。如果写错了列名编译时不会发现错误,因此开发时必须要记者列名。
2. dataset.Table[0].Rows[0].["Age"]取得的字段的值是object类型,必须小心进行类型转换,麻烦且易错。
3. 将DataSet传递给其他使用者,使用者很难识别出哪些列可以供使用。
4. 运行时才能知道列名,数据绑定麻烦,无法使用Winform、ASP.NET的快速开发功能。

VS自动生成强类型DataSet
强类型的DataSet相当于Visual Studio动态生成的组件。在Visual Studio的【属性框】中可以查看或设置其属性。

1.【添加新项】-->【数据】-->【数据集】
建立xsd文件。即强类型数据集。
例:DataSetPersons.xsd

2. 然后拖动VS中的【服务器资源管理器】中的某表到Visual Studio的中间。该动作是让Visual Studio得到表结构,且生成相应的强类型DataSet。
在这个过程中,Visual Studio会字段市场 .config文件。
例:拖动表T_Persons 。

3. 强类型DataSet的使用
Visual Studio自动生成一个类,类名称为:表名+TableAdapter 。例如:T_PersonTableAdapter类。
该对象相当于一个Adapter对象。
该对象注意有两个方法:
Fill(),GetData()
Fill()是填充强类型的DataSet。
GetData();该方法返回一个类的对象。类名称为:表名+DataTable。该类由Visual Studio自动生成。例如T_PersonDataTable

例:

代码中调用请类型数据集


补充
可空数据类型
int i=null;   错误int类型是不能为null的。

问题是,数据库返回值的时候可能为null。

C#提供可控数据类型。
int? i=null;   //表示可以为空的int 。
注意这不是表示i字段赋值为0了。这样就是让一个i可以为null,仅此而已。

int赋值给int?
int x=12;
int? y=x
这样没有问题。

int?赋值给int
注意:int与int?不是同一种数据类型。int?相对于int的派生类型。
int  表示一定部位空的数据类型。
int? 表示可能为空的数据类型。
int? i=null;
int ii=i   错误。

这样使用,
int ii=(int)i;
int ii=i.Value;
说明:这样使用即表示i一定不为空了。但是如果运行时i为null,以上的写法就会发生异常。





































 

分享到:
评论

相关推荐

    ADO.NET 4从入门到精通

    《ADO.NET 4从入门到精通》主要内容简介:ADO.NET是windows开发平台上的核心数据技术之一。《ADO.NET 4从入门到精通》是microsoft ADO.NET 4的入门教程,旨在帮助visual basic和c#开发人员了解ADO.NET及相关技术的...

    ADO.Net助手V1.00---一个获取ADO.Net连接字符串,测试SQL命令的辅助软件

    ADO.Net助手是一个获取ADO.Net连接字符串(支持Access,SQLite,SQLServer,MySQL和ORACLE),测试SQL命令,存储过程和数据库之间互导数据的辅助软件。ADO.Net助手还可以用来以插入SQL语句形式导出导入记录,目前提供了...

    ADO.NET sql、LINQ to sql、ADO.NET Entity Framework(EF)数据库连接性能比较

    数据ADO.NET sql、LINQ to sql、ADO.NET Entity Framework(EF)数据库连接性能比较,主要比较了插入与读取的时间,读取里可以进行模糊检索

    基于ADO.NET的用户登陆与注册系统

    摘要:基于ASP.NET的WEB应用程序项目,使用程序语言C#,利用ADO.NET访问数据库,实现一个简易的用户登陆注册系统。主要实现的功能有用户登陆、用户注册、找回密码,... 关键字:ASP.NET;ADO.NET;WEB;vs2010;数据库

    ADO.NET数据库访问技术详细资料

    C#与数据库访问技术 ADO.NET(ActiveX Data Object.NET)是Microsoft公司开发的用于数据库连接的... ADO.NET还提供了对XML格式文档的支持,所以通过ADO.NET组件可以方便地在异构环境的项目间读取和交换数据。 ......

    ado.net操作oracle简单参数化sql操作

    关于ado.net简单的参数化查询,操作的是oracle数据库!关于ado.net简单的参数化查询,操作的是oracle数据库!

    Microsoft ADO.NET Step by Step

    Table of Contents Microsoft ADO.NET Step by Step Introduction Part I - Getting Started with ADO.NET Chapter 1 - Getting Started with ADO.NET ...

    ADO.NET本质论

    讲解了数据结构,演示了如何用ADO.NET来解决具体的数据访问问题。重点讨论了ADO.NET如何有效地平衡"功能的泛化"和"执行效率",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问API(包括OLE DB,ADO...

    ADO.NET自己封装SqlHelper类

    ADO.NET自己封装SqlHelper类 1、简单封装 2、传递参数封装 3、参数可变封装

    Pro ADO.NET Data Services: Working with RESTful Data

    Pro ADO.NET Data Services: Working with RESTful Data Paperback: 336 pages Publisher: Apress; 1 edition (December 2, 2008) Language: English ISBN-10: 143021614X ISBN-13: 978-1430216148 Format: PDF You...

    ADO.Net数据库访问(代码示例)

    ADO.Net数据库访问(代码示例),介绍了ADO.Net数据库访问的核心技术

    ADO.NET 4从入门到精通源代码

    ADO.NET 4从入门到精通源代码 里面有 未完成的和已完成的 源代码示例

    ADO.NET高级编程

    ADO.NET是Microsoft最新推出的数据访问技术。作为.NET框架的一部分,ADO.NET绝不仅仅是前一版本ADO的简单升级。ADO.NET提供了一组.NET类,这些类不仅可以帮助我们对各种数据源进行高效访问,使我们能够对数据...

    ADO.NET技术内幕 part4

    本书是使用Microsoft Visual Studio .NET和ADO.NET编写高可伸缩性、可用Web数据库应用程序的开发人员必备指南。介绍了如何使用ADO.NET在企业级的Web应用程序中访问、排序和处理数据。通过书中丰富的实例和工具,读者...

    ado[1].net中文手册 学习 ado.net的重要资料

    通过 ADO.NET 访问数据 ADO.NET 概述 ADO.NET 的设计目标:讨论创建 ADO.NET 的动机和设计目标。 ADO.NET 结构:提供 ADO.NET 结构和组件的概述。 .NET 数据提供程序:提供有关随 ADO.NET 提供的 .NET 数据提供程序...

    ADO.NET本质论.pdf

    讲解了数据结构,演示了如何用ado.net来解决具体的数据访问问题。重点讨论了ado.net如何有效地平衡"功能的泛化"和"执行效率",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问api(包括ole db,ado...

    Professional ADO .NET Programming

    Professional ADO .NET Programming Professional ADO .NET Programming Professional ADO .NET Programming Professional ADO .NET Programming

    ADO.net操作数据库总结

    ADO.net操作数据库总结,包括SqlConnection、SqlCommand等

    .NET程序设计 实验七 ADO.NET管理数据库------学习网(实验七).zip

    2.掌握ADO.NET对象的使用方法。 3.初步熟悉数据绑定控件GridView控件的使用方法。 二.实验内容: 本实验将通过创建一个的“C#学习网”,使同学们掌握ASP.NET服务器验证控件、ADO.NET对象的使用方法,并初步熟悉...

    Microsoft ADO.NET 4 Step by Step

    Teach yourself the fundamentals of ADO.NET 4 — one step at a time. With this practical, learn-by-doing tutorial, you get the clear guidance and hands-on examples you need to start creating ...

Global site tag (gtag.js) - Google Analytics