`

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 sql、LINQ to sql、ADO.NET Entity Framework(EF)数据库连接性能比较

    本文将深入探讨三种常见的.NET框架下的数据库访问技术:ADO.NET SQL、LINQ to SQL以及ADO.NET Entity Framework(EF),并重点分析它们在数据库连接性能上的差异,特别是在插入和读取操作,包括模糊检索方面的表现。...

    学生管理系统+ADO.NET+SQL2005

    《基于ADO.NET与SQL2005的学生管理系统详解》 在信息技术日新月异的今天,学生管理系统已经成为教育机构日常管理的重要工具。本系统利用ADO.NET技术和SQL Server 2005数据库,实现了对学生的全面信息化管理,为教育...

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

    ADO.NET 4是微软.NET Framework 4的一部分,它提供了一组用于访问数据库的类和接口。这个技术允许开发者高效地创建、操作和管理数据存储,无论是关系型数据库还是其他类型的数据源。本压缩包文件“ADO.NET 4从入门到...

    ADO.NET 4从入门到精通

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

    ADO.NET核心技术(我看过最好的ADO。NET书)

    ### ADO.NET核心技术详解 #### 一、ADO.NET概述 ADO.NET是一组包含在.NET框架中的库,专门用于在.NET应用程序的各种数据存储之间进行通信。它不仅能够作为一个强大的、层次化的数据缓存来使用,还支持离线处理数据...

    ADO.NET官方参考文档2021-09.pdf

    ADO.NET 是 .NET Framework 中用于访问关系数据库的关键组件,它提供了与各种数据源(如 SQL Server、Oracle 等)交互的灵活性。在2021-09版的官方参考文档中,主要关注了DataSet、DataTable、DataView这三个核心类...

    ADO.NET 全面解析ADO.NET

    ADO.NET是Microsoft开发的一种用于访问关系数据库的数据访问技术,它为.NET Framework应用程序提供了一套全面的数据访问组件。本文将深入探讨ADO.NET的核心概念、对象模型和数据操作。 首先,我们来看ADO.NET的设计...

    自做的ADO.NET项目 借阅图书

    《自做的ADO.NET项目——借阅图书》 在信息技术领域,数据库管理是不可或缺的一部分,而ADO.NET作为.NET框架中用于数据库交互的重要组件,为开发者提供了高效、强大的数据访问能力。本项目“借阅图书”正是基于ADO...

    《ADO.NET专业项目实例开发》源代码

    ADO.NET是微软.NET框架的一部分,主要用于访问和操作数据库。它为开发者提供了强大的数据访问接口,使得程序员能够高效地处理各种数据库任务,如查询、更新、插入数据等。本资源是《ADO.NET专业项目实例开发》一书的...

    ADO.NET教程(适合新手)

    ADO.NET是微软.NET框架下的一种数据访问技术,用于与数据库进行交互。它是.NET应用程序与数据库之间通信的基础,提供了高效、灵活的数据处理能力。本教程专为初学者设计,旨在帮助新接触ADO.NET的开发者理解其核心...

    ado.net面试题

    ADO.NET 是微软为.NET Framework 设计的一种全新的数据库访问技术,它是对传统ADO(ActiveX Data Objects)的升级,旨在提供更高效、更易用的数据访问接口。ADO.NET 的设计核心是面向数据集而非数据库,这使得它更适合...

    ADO.NET本质论.rar

    ADO.NET是微软开发的一种用于访问数据的框架,它在.NET Framework中扮演着核心角色,为开发者提供了高效、灵活的数据访问接口。"ADO.NET本质论"这本书深入探讨了ADO.NET的内在原理和实际应用,旨在帮助读者理解并...

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

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

    轻轻松松掌握ADO.NET事务处理方法技巧

    轻轻松松掌握 ADO.NET 事务处理方法技巧 ADO.NET 事务处理方法是指在编程中使用的一种机制,用于保证数据一致性和完整性。事务是一组不可分的 SQL 语句,在编程中也是很难解决的一个问题。ADO.NET 事务处理方法提供...

    ADO.net大数据量操作数据库实验

    本实验“ADO.NET大数据量操作数据库实验”聚焦于如何高效地在SQL Server中存储和处理大量数据。实验环境基于Visual Studio 2015(VS2015)和SQL Server 2008,采用多种方法来演示批量数据插入,包括常规方法、Bulk ...

    ADO.net操作数据库总结

    ADO.net 操作数据库总结 ADO.net 是 một 微软公司开发的数据库访问技术,用于与关系数据库管理系统(RDBMS)交互。以下是 ADO.net 操作数据库的总结,包括使用 SqlConnection 和 SqlCommand 对象连接数据库、执行...

    【传智播客.Net培训—ADO.Net】5练习登录

    【标题】:“【传智播客.Net培训—ADO.Net】5练习登录”指的是一个关于ADO.NET技术在实际登录功能中的应用教程。这个练习可能是针对初学者或者已经有一定基础的.Net开发者设计的,旨在通过实际操作加深对ADO.NET的...

    ADO.NET数据库访问技术案例教程

    ADO.NET是微软.NET框架下的一种数据访问技术,用于与各种关系型数据库进行交互。它提供了一组组件和服务,使得开发者可以高效、灵活地存取和处理数据。在本"ADO.NET数据库访问技术案例教程"中,我们将深入探讨ADO...

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

    ADO.NET是微软.NET框架的一部分,它提供了一组用于与数据源进行交互的组件,使得开发者能够高效、灵活地处理各种数据库操作。这个标题"ADO.Net数据库访问(代码示例)"暗示我们将深入探讨如何使用ADO.NET进行数据库的...

    ADO.NET数据库实例

    ADO.NET是微软.NET框架下的一种数据访问技术,用于与各种关系型数据库进行交互,包括SQL Server、Oracle、MySQL等。这个实例着重展示了如何利用ADO.NET进行数据库的基本操作,如连接数据库、执行SQL语句、处理结果集...

Global site tag (gtag.js) - Google Analytics