ADO.NET常用对象
一、Connection对象
Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接。所有Connection对象的基类都是DbConnection类。
Connection对象有两个重要属性:
(1)ConnectionString:表示用于打开 SQL Server 数据库的字符串;
(2)State:表示 Connection 的状态,有Closed和Open两种状态。
Connection对象有两个重要方法:
(1)Open()方法:指示打开数据库;
(2)Close()方法:指示关闭数据库。
1
2
3
4
5
6
7
|
SqlConnection connection = new SqlConnection( "server=localhost;database=pubs;uid=sa;pwd=''" ;); //注意,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")是将当前时间格式化为类似于2008-10-09 00:00:03的形式的字符串 Response.Write( "时间" + DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss" )+ "当前数据库连接状态是:" +connection.State + "<br/>" ); connection.Open(); Response.Write( "时间" + DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss" ) + "当前数据库连接状态是:" + connection.State + "<br/>" ); connection.Close(); Response.Write( "时间" + DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss" ) + "当前数据库连接状态是:" + connection.State + "<br/>" ); |
【技巧】利用Visual Studio数据源控件生成数据库连接字符串。根据向导“新建连接”后,会出现一个“添加连接”的对话框,在这里可以根据实际需要更改数据源。这个连接向导配置连接到Access数据库文件、ODBC数据源、SQL Server数据库、SQL Server手机版数据库、SQL Server数据库文件、Oracle数据库文件及其它数据库。 在这里我们选择Microsoft SQL Server选项,连接到SQL Server数据库。如果我们在局域网中,我们可以点击“添加连接”界面中的刷新按钮来查看局域网中有哪些SQL Server数据库可以连接。连接到数据库可以用下面的方式:
(1)如果要连接的数据库服务器与开发者的机器在同一个局域网里,可以使用局域网IP地址或者局域网中的电脑主机名;
(2)如果要连接的数据库服务器与开发者的机器不在同一个局域网内,那么就要求数据库服务器必须有一个公网IP,我们可以使用公网IP来连接,如果数据库服务器还有互联网域名,那么用互联网域名也是可以的。
(3)如果要连接的数据库服务器与开发者所使用的机器是同一台机器,那么可以使用以下几种方式之一:”(local)”或者”.”或者”127.0.0.1”。 需要注意的是,如果在一台机器上运行者同一种数据库的不同版本,比如说在”xxxxx”这台主机上同时运行着SQL 2000、SQL 2005和SQL Express三种版本,并且它们所使用的Windows服务名分别为”SQL2000”、”SQL2005”和”SQLExpress”,那么我们要连接到SQL 2000这个数据库上所使用的服务器名就应该填写”xxxxx\SQL2000”这种“主机名\实例名”的方式或者“主机IP\实例名”,这种情况在同时安装了Visual Studio 和SQL 的朋友那里很常见,因为SQL Express是针对学生的功能有限的免费版本,这个版本的数据库在安装Visual Studio 时默认是一同安装的。点击一下“测试连接”按钮,如果弹出连接成功的提示消息就表示这个数据库连接是可用的。点击“确定”按钮,回到“配置数据源”界面,这时候点击连接字符串旁边的”+”按钮就可以看到数据库的连接字符串信息。
二、Command对象
Command对象也称为数据库命令对象,Command对象主要执行包括添加、删除、修改及查询数据的操作的命令。也可以用来执行存储过程。用于执行存储过程时需要将Command对象的CommandType 属性设置为CommandType.StoredProcedure,默认情况下CommandType 属性为CommandType.Text,表示执行的是普通SQL语句。
Command主要有三个方法:
ExecuteNonQuery():执行一个SQL语句,返回受影响的行数,这个方法主要用于执行对数据库执行增加、更新、删除操作,注意查询的时候不是调用这个方法。
1
2
3
4
5
6
7
8
|
OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath( "person.mdb" ); conn.Open(); string strSQL = "insert into grade values(12,'女','小张',78,86,98)" ; OleDbCommand Comm = new OleDbCommand(strSQL, conn); Comm.ExecuteNonQuery(); conn.Close(); |
ExecuteReader ():执行一个查询的SQL语句,返回一个DataReader对象。
1
2
3
4
5
6
7
8
|
SqlConnection Conn = new SqlConnection(); Conn.ConnectionString = "server=localhost;database=pubs;uid=sa;pwd=''" ; Conn.Open(); SqlCommand Comm = new SqlCommand( "select * from Authors" , Conn); SqlDataReader dr = Comm.ExecuteReader(); dg.DataSource = dr; dg.DataBind(); Conn.Close(); |
ExecuteScalar ():从数据库检索单个值。这个方法主要用于统计操作。ExecuteScalar ()这个方法是针对SQL语句执行的结果是一行一列的结果集,这个方法只返回查询结果集的第一行第一列。
1
2
3
4
5
6
7
8
9
|
OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath( "person.mdb" ); conn.Open(); string strSQL = "select avg(数学) from grade" ; OleDbCommand Comm = new OleDbCommand(strSQL, conn); double d = ( double )Comm.ExecuteScalar(); Message.Text = "所有人数学的平均成绩为:" +d.ToString()+ "分" ; conn.Close(); |
【注意】在操作数据库的时候,为了提高性能,都遵循一个原则:数据库连接对象应该尽可能晚打开,尽可能早关闭。在上面的例子中,在Command对象需要执行数据库操作之前才打开数据库连接对象,执行数据库操作之后马上就关闭了数据库连接对象。
三、DataReader对象
DataReader对象是一个读取行的只读流的方式,绑定数据时比使用数据集方式性能要高,因为它是只读的,所以如果要对数据库中的数据进行修改就需要借助其它方法将所作的更改保存到数据库。
DataReader对象不能通过直接实例化,必须借助与相关的Command对象来创建实例,例如用SqlCommand的实例的ExecuteReader()方法可以创建SqlDataReader实例。因为DataReader对象读取数据时需要与数据库保持连接,所以在使用完DataReader对象读取完数据之后应该立即调用它的Close()方法关闭,并且还应该关闭与之相关Connection对象。在.net类库中提供了一种方法,在关闭DataReader对象的同时自动关闭掉与之相关的Connection对象,使用这种方法是可以为ExecuteReader()方法指定一个参数,如: SqlDataReader reader =command.ExecuteReader(CommandBehavior.CloseConnection); CommandBehavior是一个枚举,上面使用了CommandBehavior枚举的CloseConnection值,它能在关闭SqlDataReader时关闭相应的SqlConnection对象。
并且DataReader对象读取数据有三种方式:
一种是按查询的时候列的索引用指定的方式来读取列值,无需做相应转换,如GetByte(int i)就是读取第i列的值并且转换成byte类型的值。第这种方法的优点是指定列后直接将该列的直接读取出来了,无需再转换,缺点是一旦指定的列不能按照指定的方式转换时就会抛出异常,比如数据库里字段的类型是string类型或者该字段的值为空时按照GetByte(i)这种方式读取会抛出异常。
第二种方式就是按照列索引的方式读取,在读取的时候并不进行值转换,如:reader[5]就是读取第5列的值(这里reader是一个Reader对象的实例),这样得到的值是一个object类型的值,这也很好理解,因为在数据库可能存储各种类型的值,而object是所有类的基类,所以这个方法不会抛出异常。如果要得到它的正确类型,还需要根据数据库里的字段进行进行相应转换。
最后一种是按照列名的方式去读,并且在读的时候也不进行相应转换,得到的是object类型的值。 综合前面三种方式各有特点,第一种方式最直接,但是有可能抛出异常,第二种方式比第一种稍微灵活一些,我们可以根据读取到值为空(在.net里用DBNull类来表示,可以表示数据库中任意数据类型的空值),我们就不进行相应的类型转换,避免出现异常。第三种方式按照列的名字来读取数据,也需要按照第二种方式进行一定的转换。就性能来说第一种最高,第二种稍低,第三种最低(这很好理解,假设要在一个旅馆里找人直通过房间号找肯定比通过名字找快),就灵活性来说第三种最灵活,第二种次之,第一种最不灵活(假如在后来编写SQL语句中更改了列的索引,第一种和第二种都可能出现问题)。实际开发中根据实际情况选择合适的方式。
使用 DataReader 检索数据的步骤:
1、创建 Command 对象
2、调用 ExecuteReader() 创建 DataReader 对象
3、使用 DataReader 的 Read() 方法逐行读取数据
4、读取某列的数据,(type)dataReader[ ]
5、关闭 DataReader 对象
注意:DataReader 使用后必须关闭
参考代码:
1
2
3
4
5
6
7
8
9
10
11
|
string sql = "SELECT StudentName FROM Student WHERE StudentName LIKE '李%' "; SqlCommand command = new SqlCommand(sql, connection); connection.Open(); SqlDataReader dataReader = command.ExecuteReader(); Console.WriteLine( "查询结果:" ); while (dataReader.Read()) { Console.WriteLine(( string )dataReader[ "StudentName" ]); } dataReader.Close(); |
四、DataAdapter对象
DataAdapter对象也称之为数据适配器对象,DataAdapter对象利用数据库连接对象(Connection)连接的数据源,使用数据库命令对象(Command)规定的操作从数据源中检索出数据送往数据集对象(DataSet),或者将数据集中经过编辑后的数据送回数据源。 数据适配器将数据填入数据集时调用方法Fill(),语句如下:
//直接填充表
dataAdapter1.Fill (dataTable);
或者
//填充dataSet11数据集中的"Products"表
dataAdapter1.Fill (dataSet11, "Products");
当dataAdapter1调用Fill() 方法时将使用与之相关联的命令组件所指定的 SELECT 语句从数据源中检索行。然后将行中的数据添加到 DataSet 中的DataTable 对象中或者直接填充到DataTable的实例中,如果 DataTable 对象不存在,则自动创建该对象。 当执行上述SELECT语句时,与数据库的连接必须有效,但不需要用语句将连接对象打开。如果调用Fill()方法之前与数据库的连接已经关闭,则将自动打开它以检索数据,执行完毕后再自动将其关闭。如果调用Fill()方法之前连接对象已经打开,则检索后继续保持打开状态。
注意:一个数据集中可以放置多张数据表。但是每个数据适配器只能够对应于一张数据表。
五、DataSet对象
DataSet对象也称为数据集对象,DataSet对象用于表示那些储存在内存中的数据,它相当于一个内存中的数据库。它可以包括多个DataTable对象及DataView对象。DataSet主要用于管理存储在内存中的数据以及对数据的断开操作。 由于DataSet对象提供了一个离线的数据源,这样减轻了数据库以及网络的负担,在设计程序的时候可以将DataSet对象作为程序的数据源。
六、DataTable对象
DataTable 是 ADO.NET 库中的核心对象,就像普通的数据库中的表一样,它也有行和列。它主要包括DataRow和DataColumn,分别代表行和列。
(1) 数据行(DataRow)
数据行是给定数据表中的一行数据,或者说是数据表中的一条记录。它可能代表一个学生、一位用户、一张订单或者一件货物的相关数据。DataRow对象的方法提供了对表中数据的插入、删除、更新和查看等功能。提取数据表中的行的语句如下:
DataRow dr = dt.Rows[n];
其中:DataRow代表数据行类;dr是数据行对象;dt代表数据表对象; n代表行的序号(序号从0开始)。
(2) 数据列(DataColumn)
数据表中的数据列(又称字段)定义了表的数据结构,例如,可以用它确定列中的数据类型和大小,还可以对其他属性进行设置。例如,确定列中的数据是否是只读的、是否是主键、是否允许空值等;还可以让列在一个初始值的基础上自动增殖,增值的步长还可以自行定义。 某列的值需要在数据行的基础上进行。语句如下:
1
2
3
|
string dc = dr.Columns[ "字段名" ].ToString(); 或者 string dc = dr.Column[i].ToString(); //i表示对应的列索引 |
如若想取出数据表(dt)中第3条记录中的“姓名”字段,并将该字段的值放入一输入框(textBox1)中时,语句可以写成:
1
2
|
DataRow dRow = dt.Rows[2 ]; // 从数据表提取行 string textBox1.Text=dRow[ "CompanyName" ].ToString(); // 从行中取出字段的值 |
一个基本的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//实例化Connection对象 SqlConnection connection = new SqlConnection("Data Source=(local); Initial Catalog=数据库名;Persist Security Info=True;User ID=sa;Password=sa"); connection.open(); //要执行查询,则先需要实例化Command对象, SqlCommand command = new SqlCommand( "select * from UserInfo where sex=0" , connection); SqlDataAdapter adapter = new SqlDataAdapter(command); /* 下面的被注释掉的代码与上面的代码是等效的 SqlDataAdapter adapter = new SqlDataAdapter("select * from UserInfo where sex=0",connection); */ DataTable data = new DataTable(); adapter.Fill(data); /* 下面的被注释掉语句与上面填充DataTable的效果是一样的,我更倾向于没有注释掉的部分 DataSet ds = new DataSet();//实例化DataSet adapter.Fill(ds, "UserInfo");//填充ds中的"UserInfo"表 DataTable data = ds.Tables["UserInfo"]; */ connection.close(); |
ADO.NET常用对象的更多相关文章
- ADO.NET常用对象的基础概念强化
1.Command对象 1.1 ExcuteNonquery---执行非查询语句,返回受影响的行数,在新增,删除,修改的时候,如果我们要返回结果集那么就不能使用它了: 1.2 ExcuteScalar ...
- ADO.NET 核心对象简介
ADO.NET是.NET中一组用于和数据源进行交互的面向对象类库,提供了数据访问的高层接口. ADO.NOT类库在System.Data命名空间内,根据我们访问的不同数据库选择命名空间,System. ...
- 数据库学习之ADO.NET五大对象
1 [ADO.NET] ado.net 是一种数据访问技术,使得应用程序能够连接到数据存储,并以各种方式操作存储在里面的数据. 2 [ADO.NET五大常用对象] Connec ...
- ADO.NET五大对象理论和实践(草稿)
一.ADO.NET五大对象理论 1. Connection:与数据源建立连接. 2. Command:对数据源执行SQL命令并返回结果. Command对象在执行的的时候有几个比较重要的方法,如Exe ...
- JavaScript常用对象的方法和属性
---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...
- Java的常用对象①②
Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...
- DOM_05之DOM、BOM常用对象
1.HTML DOM常用对象之Table:①创建:createTHead():createTBody():createTFoot():②删除:deleteTHead():deleteTFoot():③ ...
- DOM_04之常用对象及BOM
1.添加:①var a=document.createElement("a"):②设置关键属性:③将元素添加到DOM树:a.parent.appendChild(a):b.pare ...
- DOM_03之元素及常用对象
1.修改样式:访问内联样式:elem.style.css属性名:获得其他:var style=getComputerStyle(elem):*(* 获得焦点onfocus:失去焦点onblur:): ...
随机推荐
- 数据结构:优先队列 基于list实现(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...
- stream_set_timeout (fread 造成了php程序timeout)
最近在执行fread时候,php出现了 "Fatal error: Maximum execution time of 30 seconds " fread() :从文件指针 ha ...
- webpack 使用优化指南
前言 本文不是webpack入门文章,如果对webpack还不了解,请前往题叶的Webpack入门,或者阮老师的Webpack-Demos. 为什么要使用Webpack 与react一类模块化开发的框 ...
- JavaScript 函数表达式
JavaScript中创建函数主要有两种方法:函数声明和函数表达式.这两种方式都有不同的适用场景.这篇笔记主要关注的是函数表达式的几大特点以及它的使用场景,下面一一描述. 主要特点 可选的函数名称 函 ...
- JokeClient-Swift 仿写学习
required init?(coder aDecoder: NSCoder) 可失败构造器 在init关键字后面添加问号(init?). 可失败构造器会创建一个类型为自身类型的可选类型的对象.你通过 ...
- 简述AOP编程
aop是面向切面编程的简称,对业务逻辑中的各个部分切割隔离,使耦合度降到最低,不仅增加了开发效率,还增强了系统的重用性和可维护性. 个人理解是把面向对象编程和面向函数编程结合在了一起. 说了这多的好处 ...
- android MVP设计模式!
实现原理: MainActivity 用来更新UI,和显示业务逻辑的结果! LoginPresenterCompl 用来处理 业务逻辑 ILoginPresenter 业务处理类抽象出来的接口 ILo ...
- JavaSE 之 final 初探
我们先看一道面试题: 请问 final 的含义是什么?可以用在哪里?其初始化的方式有哪些? 首先我们回答一下这道题,然后再探究其所以然. 1.final 表示“最终的”.“不可改变的”,意指其修饰类 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- javascript设计模式-工厂方法模式
工厂方法模式笔记 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例 对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在 通过工厂方法模 ...