当前位置:文档之家› Csharp与数据库访问技术

Csharp与数据库访问技术

Csharp c# 数据库

2.1 https://www.doczj.com/doc/628321029.html,概述 (2)

2.1.1 https://www.doczj.com/doc/628321029.html,体系结构 (2)

2.1.2 https://www.doczj.com/doc/628321029.html,对象模型 (3)

2.2 Connection 对象与数据库连接 (4)

2.2.1 Connection对象的常用属性 (4)

2.2.2 Connection对象的连接字符串 (5)

2.2.3 Connection对象的常用方法 (7)

2.3 Command(数据命令)对象与查询语句 (11)

2.3.1 Command对象的常用属性 (11)

2.3.2 Command对象的常用方法 (12)

2.3.3 Command对象创建SQl语句代码示例 (16)

综合示例 (18)

4.4.2 实例演示DataReader (32)

2.4 DataReader对象与数据获取 (35)

2.4.1 DataReader对象的常用属性 (35)

2.4.2 DataReader对象的常用方法 (35)

2.4.3 DataReader对象访问数据库代码示例 (36)

2.5 DataAdaDter对象 (38)

2.5.1 DataAdapter对象的常用属性 (38)

2.5.2 DataAdapter对象的常用方法 (39)

2.5.3 DataAdapter对象代码示例 (40)

2.6 DataSet对象 (42)

2.6.1 DataSet对象概述 (42)

2.6.2 DataSet对象模型 (42)

2.6.3 DataCOIumn和DataRow对象 (44)

2.6.4 使用DataSet对象访问数据库 (47)

2.7 https://www.doczj.com/doc/628321029.html, 代码综合示例 (48)

2.7.1 使用OLE https://www.doczj.com/doc/628321029.html, Provider (48)

2.7.2 使用SQL Server .NET Provider (49)

2.7.3 数据库访问综述 (50)

2.8 DataGrid控件与数据库访问技术 (50)

2.8.1 DataGrid控件与数据绑定 (50)

2.8.2 DataGrid代码示例 (50)

2.9 本章小结 (52)

C#与数据库访问技术

https://www.doczj.com/doc/628321029.html,(ActiveX Data https://www.doczj.com/doc/628321029.html,)是Microsoft公司开发的用于数据库连接的一套组件模型,是ADO的升级版本。

由于https://www.doczj.com/doc/628321029.html,组件模型很好地融入了.NET Framework,所以拥有.NET Framework的平台无关、高效等特性。程序员能使用https://www.doczj.com/doc/628321029.html,组件模型,方便高效地连接和访问数据库。

1 https://www.doczj.com/doc/628321029.html,概述

https://www.doczj.com/doc/628321029.html,是与数据库访问操作有关的对象模型的集合,它基于Microsoft的.NET Framework,在很大程度上封装了数据库访问和数据操作的动作。

https://www.doczj.com/doc/628321029.html,同其前身ADO系列访问数据库的组件相比,做了以下两点重要改进:

⑥https://www.doczj.com/doc/628321029.html,引入了离线的数据结果集(Disconnected DataSet)这个概念,通过使用离线的数据结果集,程序员更可以在数据库断开的情况下访问数据库。

⑥https://www.doczj.com/doc/628321029.html,还提供了对XML格式文档的支持,所以通过https://www.doczj.com/doc/628321029.html,组件可以方便地在异构环境的项目间读取和交换数据。

1.1 https://www.doczj.com/doc/628321029.html,体系结构

https://www.doczj.com/doc/628321029.html,组件的表现形式是.NET的类库,它拥有两个核心组件:.NET Data Provider(数据提供者)和DataSet(数据结果集)对象。

.NET Data Provider是专门为数据处理以及快速地只进、只读访问数据而设计的组件,包括Connection、Command、DataReader和DataAdapter四大类对象,其主要功能是:

⑥在应用程序里连接数据源,连接SQL Server数据库服务器。

⑥通过SQL语句的形式执行数据库操作,并能以多种形式把查询到的结果集填充到DataSet里。

DataSet对象是支持https://www.doczj.com/doc/628321029.html,的断开式、分布式数据方案的核心对象。DataSet是数据的内存驻留表示形式,无论数据源是什么,它都会提供一致的关系编程模型。它是专门为独立于任何数据源的数据访问而设计的。

DataSet对象的主要功能是:

⑥用其中的DataTable和DataRelations对象来容纳.NET Data Provider对象传递过来的数据库访问结果集,以便应用程序访问。

(2)把应用代码里的业务执行结果更新到数据库中。

并且,DataSet对象能在离线的情况下管理存储数据,这在海量数据访问控制的场合是非常有利的。

图2-1描述了https://www.doczj.com/doc/628321029.html,组件的体系结构。

图2-1 https://www.doczj.com/doc/628321029.html,体系结构

1.2 https://www.doczj.com/doc/628321029.html,对象模型

https://www.doczj.com/doc/628321029.html,对象模型中有5个主要的数据库访问和操作对象,分别是Connection、Command、DataReader、DataAdapter和DataSet对象。

其中,Connection对象主要负责连接数据库,Command对象主要负责生成并执行SQL语句,DataReader对象主要负责读取数据库中的数据,DataAdapter对象主要负责在Command 对象执行完SQL语句后生成并填充DataSet和DataTable,而DataSet对象主要负责存取和更新数据。

https://www.doczj.com/doc/628321029.html,主要提供了两种数据提供者(Data Provider),分别是SQL https://www.doczj.com/doc/628321029.html, Provider和OLE https://www.doczj.com/doc/628321029.html, Provider。

SQL https://www.doczj.com/doc/628321029.html, Framework数据提供程序使用它自身的协议与SQL Server数据库服务器通信,而https://www.doczj.com/doc/628321029.html, Framework则通过OLE DB服务组件(提供连接池和事务服务)和数据源的OLE DB提供程序与OLE DB数据源进行通信。

它们两者内部均有Connection、Command、DataReader和DataAdapter 4类对象。对于不同的数据提供者,上述4种对象的类名是不同的,而它们连接访问数据库的过程却大同小异。

这是因为它们以接口的形式,封装了不同数据库的连接访问动作。正是由于这两种数据提供者使用数据库访问驱动程序屏蔽了底层数据库的差异,所以从用户的角度来看,它们的差别仅仅体现在命名上。

表2-1描述了这两类数据提供者下的对象命名。

表2-1 https://www.doczj.com/doc/628321029.html,对象描述

2.2 Connection 对象与数据库连接

在不同的Provider类型下,Connection对象的命名也是不同的,但它们有一个共同的功能,那就是管理与数据源的连接。

2.2.1 Connection对象的常用属性

Connectionion对象主要用于连接数据库,它的常用的属性如下。

ConnectionString属性:该属性用来获取或设置用于打开SQL Server

数据库的字符串。

ConnectionTimeout属性:该属性用来获取在尝试建立连接时终止尝试,

并生成错误之前所等待的时间。

DataBase属性:该属性用来获取当前数据库或连接打开后要使用的数据库

的名称。

DataSource属性:该属性用来设置要连接的数据源实例名称,

例如SQLServer的Local服务实例。

State性该属性:是一个枚举类型的值,用来表示同当前数据库的

连接状态。该属性的取值情况和含义如表2-2所示。

表2-2 Provider值描述(ConnectionSate枚举成员值)

//设置连接对象

SqlConnection conn;

//如果是空闲状态,连接数据库

if(conn.State == ConnectionState.Closed)

{

conn.Open();

}

//访问数据库的代码

……

//最后关闭连接

if(conn.State == ConnectionState.Open)

{

conn.Close();

}

2.2.2 Connection对象的连接字符串

在ConnectionString连接字符串里,一般需要指定将要连接数据源的种类、

数据库服务器的名称、数据库名称、登录用户名、密码、等待连接时间、

安全验证设置等参数信息,这些参数之间用分号隔开。下面将详细描述

这些常用参数的使用方法。

1. Provider参数

Provider参数用来指定要连接数据源的种类。如果使用的是SQL Server Datahovider,则不需要指定Provider参数,因为SQL Server DataProvider已经

指定了所要连接的数据源是SQl Server服务器。如果使用的是O1eDB Data

Provider或其他连接数据库,则必须指定Provider参数。表2-3说明了Provider参数值和连接数据源类型之间的关系。

2.Server参数

Server参数用来指定需要连接的数据库服务器(或数据域)。比如

Server=(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;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)=https://www.doczj.com/doc/628321029.html,,说明登录密码是https://www.doczj.com/doc/628321029.html,。

5.Connect Timeout参数

Connect Timeout参数用于指定打开数据库时的最大等待时间,单位是秒。

如果不设置此参数,默认是15秒。如果设置成-1,表示无限期等待,一般不推荐使用。

6.Integrated Security参数

Integrated Security参数用来说明登录到数据源时是否使用SQL Server

的集成安全验证。如果该参数的取值是True(或SSPI,或Yes),

表示登录到SQL Server时使用Windows验证模式,即不需要通过Uid和Pwd这样的方式登录。如果取值是False(或No),表示登录SQL Server时使用Uid和Pwd方式登录。

一般来说,使用集成安全验证的登录方式比较安全,因为这种方式不会暴露用户名和密码。

安装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 时,系统将从适当的池中提取SQLConnection对象,或在需要时创建该对象并将其添加到适当的池中。当取值为False时,不使用连接池。

当应用程序连接到数据源或创建连接对象时,系统不仅要开销一定的通信和内存资源,还必须完成诸如建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等任务,因此往往成为最为耗时的操作。

实际上,大多数应用程序仅使用一个或几个不同的连接配置。这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭。为了使打开的连接成本最低,https://www.doczj.com/doc/628321029.html,使用称为Pooling(即连接池)的优化方法。

在连接池中,为了提高数据库的连接效率,根据实际情况,预先存放了若干数据库连接对象,这些对象即使在用完后也不会被释放。应用程序不是向数据源申请连接对象,而是向

连接池申请数据库的连接对象。另外,连接池中的连接对象数量必须同实际需求相符,空置和满载都对数据库的连接效率不利。

Max Pool Size和Min Pool Size这两个参数分别表示连接池中最大和最小连接数量,默认分别是100和0。根据实际应用适当地取值将提高数据库的连接效率。

8.综合实例

下面通过实例来说明连接字符串的具体含义。

如果连接字符串是:

"Provider= Microsoft.Jet.OleDB.4.0;Data Source=D:\login.mdb"

则说明数据源的种类是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对象的常用方法

Connection类型的对象用来连接数据源。在不同的数据提供者的内部,Connection对象的名称是不同的,在SQL Server Data Provider里叫SqlConnection,而在OLE DB Data Provider 里叫OleDbConnection。

下面将详细介绍Connection类型对象的常用方法。

1.构造函数

构造函数用来构造Connection类型的对象。对于SqlConnection类,其构造函数说明如表2-4所示。

第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 conn=new SqlConnection(cnn);

conn.Open();

显然使用第2种方法输入的代码要少一点,但是两种方法执行的效率并

没有什么不同,另外,如果需要重用Connection对象去使用不同的身份连

接不同的数据库时,使用第一种方法则非常有效。例如:

SqlConnection conn=new SqlConnection();

conn.ConnectionString=connectionString1;

conn.Open();

//访问数据库,做一些事情

conn.Close();

conn.ConnectionString=connectionString2;

conn.Open();

//访问数据库,做另外一些事情

conn.Close();

注意:只有当一个连接关闭以后才能把另一个不同的连接字符串赋值给

Connection 对象。如果不知道Connection对象在某个时候是打开是

关闭时,可以检查Connection对象的State属性,它的值可以是Open,

也可以是Closed,这样就可以知道连接是否是打开的。

表2-5说明了OleDbConnection类的构造函数。可以看出,它们和SqlConnection类的构造函数非常相近。

2.Open和Close方法

Open和Close方法分别用来打开和关闭数据库连接,都不带参数,

均无返回值。

Open方法:使用ConnectionString所指定的属性设置打开数据库连接

Close方法:关闭与数据库的连接,这是关闭任何打开连接的首选方法

3.SqlCommand(OleDbCommand)CreateCommand()方法

SqlCommand(OleDbCommand)CreateCommand()方法用来创建一个Command类型的对象。

Command类对象一般用来执行SQL语句,关于Command对象的操作将在2.3节里详细描述。

CreateCommand()方法:创建并返回一个与SqlConnection关联的SqlCommand对象

ChangeDatabase方法:为打开的SqlConnection更改当前数据库。

注意:数据库连接是很有价值的资源,因为连接要使用到宝贵的系统资源,如内存和网络带宽,因此对数据库的连接必须小心使用,要在最晚的时候建立连接(调用Open方法),在最早的时候关闭连接(调用Close方法)。也就是说在开发应用程序时,不再需要数据连接时应该立刻关闭数据连接。这点看起来很简单,要达到这个目标也不难,关键是要有这种意识。

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)

{

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 Server2000建立一个数据库Student,并建立相应的表studentInfo

2、用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.Collections.Generic;

using https://www.doczj.com/doc/628321029.html,ponentModel;

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

{

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.Close();

if (conn.State == ConnectionState.Closed)

{

MessageBox.Show("连接已经关闭");

}

}

catch (Exception ex)

{

MessageBox.Show("数据库连接失败" + ex.Message);

}

}

}

}

2.3 Command(数据命令)对象与查询语句

建立了数据库连接之后,就可以执行数据访问操作和数据操纵操作了。一般对数据库的操作被概括为CRUD——Create、Read、Update和Delete。https://www.doczj.com/doc/628321029.html,中定义了Command类去执行这些操作。

和Connection对象类似,在.NET中存在SqlCommand和OleDbCommand,除了OleDbCommand类没有ExecuteXmlReader方法之外,OleDbCommand与SqlCommand非常类似。

Command对象主要用来执行SQL语句。利用Command对象,可以查询数据和修改数据。

Command对象是由Connection对象创建的,其连接的数据源也将由Connection来管理。而使用Command对象的SQL属性获得的数据对象,将由DataReader和DataAdapter对象填充到DataSet里,从而完成对数据库数据操作的工作。

2.3.1 Command对象的常用属性

Command对象的常用属性有Connection、ConnectionString、CommandType、CommandText 和CommandTimeout。

1.Connection属性

Connection属性用来获得或设置该Command对象的连接数据源。比如某SqlConnection 类型的conn对象连在SQL Server服务器上,又有一个Command类型的对象cmd,可以通过

cmd.Connection=conn来让cmd在conn对象所指定的数据库上操作。

不过,通常的做法是直接通过Connection对象来创建Command对象,而Command对象不宜通过设置Connection属性来更换数据库,所以上述做法并不推荐。

2.ConnectionString属性

ConnectionString属性用来获得或设置连接数据库时用到的连接字符串,用法和上述Connection属性相同。同样,不推荐使用该属性来更换数据库。

https://www.doczj.com/doc/628321029.html,mandType属性

CommandType属性用来获得或设置CommandText属性中的语句是SQL语句、数据表名还是存储过程。该属性的取值有3个:

⑥如果把CommandType设置成为Text或不设置,说明CommandText属性的值是一个SQL 语句。

⑥如果把CommandType设置成为TableDirect,说明CommandText属性的值是一个要操作的数据表的名。(SQL https://www.doczj.com/doc/628321029.html,数据提供程序不支持该属性值)

⑥如果把CommandType设置成为StoredProcedure,说明CommandText属性的值是一个存储过程。

如果不显示设置CommandType的值,则CommandType默认为Text。

String cnstr="Sever=(local); database=student; Integrated Security=true";

SqlConnection conn=new SqlConnection(cnstr);

conn.Open();

SqlCommand cmd=new SqlCommand("select * from Student", conn);

https://www.doczj.com/doc/628321029.html,mandText属性

根据CommandType属性的不同取值,可以使用CommandText属性获取或设置SQL语句、数据表名(仅限于OLE DB数据库提供程序)或存储过程。

2.3.2 Command对象的常用方法

同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Server Data Provider里叫SqlCommand,而在OLE DB Data Provider里叫OleDbCommand。

下面将详细介绍Command类型对象的常用方法,包括构造函数、执行不带返回结果集的SQL语句方法、执行带返回结果集的SQL语句方法和使用查询结果填充DataReader对象的方法。

1.构造函数

构造函数用来构造Command对象。对于SqlCommand类型的对象,其构造函数说明如表2-6所示。

(1) 第一个构造函数不带任何参数

SqlCommand cmd=newe SqlCommand();

cmd.Connection=ConnectionObject;

https://www.doczj.com/doc/628321029.html,mandText=CommandText;

上面代码段使用默认的构造函数创建一个SqlCommand对象。然后,把已有的Connection对象ConnectionObject和命名文本CommandText分别赋给了Command对象的Connection属性和CommandText属性。

例如,CommandText可以从数据库检索数据的SQL select语句:

string CommandText=" select *from studentInfo ";

除此之外,许多关系型数据库,例如SQL Server 和Oracle,都支持存储过程。可以把存储过程的名称指定为命名文本。例如,使用编写GetAllStudent存储过程为命名文本:string CommandText=" GetAllStudent ";

https://www.doczj.com/doc/628321029.html,mandType=CommandType.StoredProcedure;

(2) 第二个构造函数可以接受一个命令文本

SqlCommand cmd=newe SqlCommand(CommandText);

cmd.Connection=ConnectionObject;

上面的代码实例化了一个Command对象,并使用给定命令文本对Command对象的CommandText属性进行了初始化。然后,使用已有的Connection 对象对Command对象的Connection属性进行了赋值。

(3) 第三个构造函数接受一个Connection和一个命名文本

SqlCommand cmd=newe SqlCommand(CommandText, ConnectionObject);

注意这两个参数的顺序,第一个为string类型的命令文本,第二个为Connection对象。

(4) 第四个构造函数接受三个参数,第三个参数是SqlTransaction对象,这里不做讨论。

另外,Connection 对象提供了CreateCommand方法,该方法将实例化一个Command对象,并将其Connection属性赋值为建立该Command对象的Connection对象。

无论在什么情况下,当把Connection对象赋值给Command对象的Connection属性时,并不需要Connection对象是打开的。但是,如果连接没有打开,则在命令执行之前必须首先打开连接。

而对于OleDbCommand类型的对象,其构造函数如2-7所示。同样可以看出,它们和SqlCommand类的构造函数非常相似。

表2-7 OleDbCommand类构造函数说明

命令对象构造完成后,就可以执行命令对数据库进行操作了。命令对象所提供的用于执行命令的方法有很多种,具体使用哪个方法取决于命令的执行结果返回什么样的数据。

SqlCommand 提供了4个执行方法:ExecuteNonQuery()、ExecuteScalar()、ExecuteReader()、ExecuteXmlReader()。详细见下面相关部分。

命令对象提供的用于执行命令的方法及其含义如表

2.ExecuteNonQUery方法

ExecuteNonQuery方法用来执行Insert、Update、Delete等非查询语句和其他没有返回结果集的SQL语句,并返回执行命令后影响的行数。如果Update和Delete命令所对应的目标记录不存在,返回0。如果出错,返回-1。

String cnstr="server=(local);database=student; Integrated Security=true";

SqlConnection cn=new SqlConnection(cnstr);

cn.Open();

string sqlstr="update student set name='Jone' where name='Bill' ";

SqlCommand cmd=new SqlCommand(sqlstr, cn);

cmd.ExecuteNonQuery();

cn.Close();

ExecuteNonQuery()方法的返回值是一个整数,代表操作所影响到的行数。

3.ExecuteScalar()方法

在许多情况下,需要从SQL语句返回一个结果,例如客户表中记录的个数,当前数据库服务器的时间等。ExecuteScalar()方法就适用于这种情况。

ExecuteScalar方法执行一个SQL命令,并返回结果集中的首行首列(执行返回单个值的命令)。如果结果集大于一行一列,则忽略其他部分。根据该特性,这个方法通常用来执行包含Count、Sum等聚合函数的SQL语句。

下面的代码读取数据库中表student的记录个数,并把它输出到控制台上。

String cnstr="server=(local);database=student; Integrated Security=true";

SqlConnection cn=new SqlConnection(cnstr);

cn.Open();

string sqlstr="select count(*) from student";

SqlCommand cmd=new SqlCommand(sqlstr, cn);

object count=cmd.ExecuteScalar();

Console.WriteLine(count.ToString());

cn.Close();

ExecuteScalar()方法的返回值类型是Object,根据具体需要,可以将它转换为合适的类型。

4.ExecuteReader()方法

ExecuteReader()方法执行命令,并使用结果集填充DataReader对象。

ExecuteReader()方法用于执行查询操作,它返回一个DataReader对象,通过该对象可以读取查询所得的数据。

ExecuteReader()方法在Command对象中用得比较多,通过DataReader类型的对象,应用程序能够获得执行SQL查询语句后的结果集。该方法的两种定义为:

⑥ExecuteReader(),不带参数,直接返回一个DataReader结果集。

⑥ExecuteReader(CommandBehavior behavior),根据behavior的取值类型,决定DataReader 的类型。

如果behavior取值是CommandBehavior.SingleRow这个枚举值,则说明返回的ExecuteReader只获得结果集中的第一条数据。如果取值是CommandBehavior.SingleResult,则说明只返回在查询结果中多个结果集里的第一个。

一般来说,应用代码可以随机访问返回的ExecuteReader列,但如果behavior取值为CommandBehavior.SequentialAccess,则说明对于返回的ExecuteReader对象只能顺序读取它包含的列。也就是说,一旦读过该对象中的列,就再也不能返回去阅读了。这种操作是以方便性为代码换取读数据时的高效率,需谨慎使用。

String cnstr="server=(local);database=student; Integrated Security=true";

SqlConnection cn=new SqlConnection(cnstr);

cn.Open();

string sqlstr="select * from student";

SqlCommand cmd=new SqlCommand(sqlstr, cn);

SqlDataReader dr=cmd.ExecuteReader();

while(dr.Read())

{

String name=dr["姓名"].ToString();

Console.WriteLine(name);

}

dr.Close();

cn.Close();

这段代码从数据库的student表中读取全部数据,并把该表的“姓名”字段的数据全部输

出到控制台上。

ExecuteXmlReader

SqlCommand特有的方法,OleDbCommand无此方法。该方法执行将返回XML字符串的命令。它将返回一个包含所返回的XML的System.Xml.XmlReader对象。

2.3.3 Command对象创建SQl语句代码示例

在下面这段代码里,首先根据连接字符串创建一个SqlConnecdon连接对象,并用此对象连接数据源:然后创建一个SqlCommand对象,并用此对象的ExecuteNonQuery方法执行不带返回结果集的SQL语句。

//连接字符串

private static string strConnect=" data source=localhost;

uid=sa;pwd=aspent;database=LOGINDB"

// 根据连接字符串创建SqlConnection 连接句柄

SqlConnetion objConnection =new SqlConnection(strConnect);

//数据库命令

SqlCommand objCommand =new SqlCommand( " ",objConnection);

// 设置sql语句

https://www.doczj.com/doc/628321029.html,mandText= " INSERT INTO USERS " + " (USERNAME, NICKNAME, USERPASSWORD, USEREMAIL, USERROLE, CREATDATE, LASTMODIFYDATE) "+ " V ALUES " +" (@USERNAME, @NICKNAME, @USERPASSWORD, @USEREMAIL, @USERROLE, @CREATDATE, @LASTMODIFYDATE ) ";

// 以下省略设置各值的语句

……

try

{

//打开数据库连接

if( objConnection.State == ConnectionState. Closed )

{

objConnection.Open();

}

//获取运行结果,插入数据

objCommand.ExecuteNonQuery();

//省略后继动作

……

}

catch(SqlException e)

{

Response.Write(e.Message.ToString());

}

finally

{

//关闭数据库连接

if(objConnection.State == ConnectionState.Open)

{

objConnection.Close();

}

}

这段代码是连接数据库并执行操作的典型代码。其中,操作数据库的代码均在try…catch … finally结构中,因此代码不仅能正常地操作数据库,更能在发生异常的情况下抛出异常。另外,不论是否发生异常,也不论发生了哪种数据库操作的异常,finally块里的代码均会被执行,所以,一定能保证代码在访问数据库后关闭连接。

而在下面的代码里,将使用Command对象执行查询类的SQL语句,并将结果集赋给DataRead对象。

private static string strConnect=" data source=localhost;

uid=sa;pwd=aspent;database=LOGINDB"

SqlConnetion objConnection =new SqlConnection(strConnect);

SqlCommand objCommand =new SqlCommand( " ",objConnection);

// 设置sql语句

https://www.doczj.com/doc/628321029.html,mandText= "SELECT * FROM USERS ";

try

{

//打开数据库连接

if( objConnection.State == ConnectionState. Closed )

objConnection.Open();

//获取运行结果

SqlDataReader result=objCommand.ExecuteReader();

//省略后继动作

……

}

catch(SqlException e)

{

Response.Write(e.Message.ToString());

}

finally

{

//关闭数据库连接

if(objConnection.State == ConnectionState.Open)

{

objConnection.Close();

}

}

这里用到DataReader对象来获得结果集,如果仅仅想返回查询结果集的第一行第一列的值,可以将SqlDataReader result=objCommand.ExecuteReader();改成objCommand.ExecuteScalar().ToString();

综合示例

表:

1、ExecuteScalar方法

ExecuteScalar方法执行返回单个值的命令。例如,如果想获取Student数据库中表studentInfo 的学生的总人数,则可以使用这个方法执行SQL查询:

Select count(*) from studentInfo .

(1) 建立Windows Application 应用程序

(2) 在Form1上添加一个按钮Button控件和一个标Label签控件

(3) 双击按钮,自动进入代码编辑界面

首先添加命名空间:using System.Data.SqlClient;

(4)编写按钮的Click事件的处理事件代码:

using System;

using System.Collections.Generic;

using https://www.doczj.com/doc/628321029.html,ponentModel;

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

{

//定义命令文本

string commandText = "select count(*) from studentInfo";

//定义连接字符串

string connString="server=(local);Initial Catalog=Student;

Integrated Security=SSPI;";

//string connString= "server=(local);user id=sa;

Initial Catalog=Student;pwd=;";

//定义Connection对象

SqlConnection conn = new SqlConnection();

//设置Connection对象的ConnectionString属性

conn.ConnectionString = connString;

//新建Command对象,此时conn对象并不需要打开连接

SqlCommand cmd = new SqlCommand(commandText, conn);

//打开连接

conn.Open();

//执行命令,返回结果

string count = cmd.ExecuteScalar().ToString();

//记得关闭连接

conn.Close();

https://www.doczj.com/doc/628321029.html,bel1.Text = "共有" + count + "位学生!";

}

catch (Exception ex)

{

MessageBox.Show("数据库连接失败" + ex.Message);

}

}

}

}

执行结果界面如图:

分析代码:

第1步是引入命名空间:System.Data.SqlClient,表示将使用SQL https://www.doczj.com/doc/628321029.html, 数据提供程序:using System.Data.SqlClient;

第2步是按钮button1_Click单击事件中首先新建立了连接并设置了其连接字符串属性:

string connString="server=(local);Initial Catalog=Student;Integrated Security=SSPI;";

//string connString= "server=(local);user id=sa;Initial Catalog=Student;pwd=;";

//定义Connection对象

SqlConnection conn = new SqlConnection();

//设置Connection对象的ConnectionString属性

conn.ConnectionString = connString;

第三步,新建Command 对象,并将命名文本和连接对象传递给其构造函数:SqlCommand cmd = new SqlCommand(commandText, conn);

其中,commandText为最初定义的命名文本:

string commandText = "select count(*) from studentInfo";

此时conn对象没有打开,因为这不是必须的。

第四步现在需要执行操作了,所以首先要打开连接,然后执行操作:

conn.Open();

string count = cmd.ExecuteScalar().ToString();

由于ExecuteScalar()方法返回类型为object,因此使用了ToString()方法将其转换为string 以后赋值给count。

注意:一般使用ExecuteScalar()方法时都必须用到类型转换。

相关主题
文本预览
相关文档 最新文档