ado.net详细研究(二) —— DataReader(一)

这次我们详细研究 DataReader 。我个人最喜欢的就是 DataReader ,虽然它不如 DataSet 强大,但是在很多情况下我们须要的是灵活的读取数据而不是大量的在内存里面缓存数据。比如在网络上每个用户都缓存大量的 dataset ,这很可能导致服务器内存不足。另外 dataReader 尤其适合读取大量的数据,因为它不在内存中缓存数据。

由于下面的讨论都设计到数据库操作,我们虚拟一个小项目:个人通讯录(单用户),这意味着我们须要一个 contract 的数据库,包含 admin 和 fridend :

admin : Aname , Apassword

friend : Fname , Fphone , Faddress , Fid (主键)

当然,你可以根据自己的须要设计 friend 表,比如添加 Fsex 等字段,这里不详细列举。对应数据库建立文件:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[admin]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[admin]

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[friend]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[friend]

GO

CREATE TABLE [dbo].[admin] (

[Aname] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,

[Apassword] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL

) ON [PRIMARY]

GO

CREATE TABLE [dbo].[friend] (

[Fid] [int] IDENTITY (1, 1) NOT NULL ,

[Fname] [varchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,

[Fphone] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,

[Faddress] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO

在讨论 DataReader 之前我们必须了解 Connection 和 Command ,虽然前面我们已经简短的介绍过了。

以下的所有讨论都针对 Sql Server2000 ,使用的命名空间为 System.Data.SqlClient 。当然如果你须要使用 OleDb ,那是很方便的(基本上是把 Sql 替换成为 OleDb 就可以了)。

** 1, ** ** SqlConnection ** ** 类 **

连接 Sql server 首先必须实例化一个 SqlConnection 对象:

SqlConnection Conn = new SqlConnection(ConnectionString);

Conn.Open();

或者

SqlConnection Conn = new SqlConnection() ;

Conn.ConnectionString = ConnectionString;

Conn.Open();

我比较喜欢前者,但是当你须要重新使用 Connection 对象去连接另外的数据库的时候,第二种方法非常有效(不过这种机会很少,一般来说一个小型系统只对应一个数据库——个人认为 ^_^ )。

SqlConnection Conn = new SqlConnection() ;

Conn.ConnectionString = ConnectionString1;

Conn.Open();

//do something

Conn ,Close();

Conn.ConnectionString = ConnectionString2;

Conn.Open();

//do something else

Conn ,Close();

注意只有关闭一个连接以后才能使用另外的连接。

如果你不清楚 Connection 对象的状态,可以使用 State 属性,它的值为 Open 或者 Closed ,当然也还有其他值如 Executing 或者 Broken ,但是 Sql server 等当前版本都不支持。

If(Conn.State == ConnectionState.Open)

Conn.Colse();

上面一直提到 ConnectionString ,一般连接 sql server 的字符串为:

Data source = serverName;Initial catalog =contract;user id =sa;password= yourpassword;

如果你的 sql server 使用的是 windows 集成密码,则是:

Data source = serverName;Initial catalog = contract;Integrated Security = SSPI;

至于其他的 oledb 或者 odbc 连接串可以到 http://www.connectionstrings.com

连接上数据库以后一定记得关闭连接,在 ado.net 中当 Connection 对象超出范围时连接不会自动关闭。

打开数据库连接以后我们要执行命令,所以我们讨论一下 Command 类

** 2 SqlCommand ** ** 类 **

建立数据库连接以后我们须要访问和操作数据库—— CRUD : Create 、 Read 、 Update 、 Delete 。

为了执行命令我们创建 Command 对象, Comand 对象要求执行 Connection 对象和 CommandText 对象。

SqlCommand cmd = new SqlCommand();

cmd.Connection = ConnectionObject;// 比如我们先前建立的 Conn 对象

cmd.CommandText = CommandText;// 比如一个 Select 语句

string CommandText = “ Select * from friend ”;

当然我们也可以使用存储过程,这个以后讨论。

另外的方法:

SqlCommand cmd = new SqlCommand(CommandText);

cmd.Connection = ConnectionObject;// 比如我们先前建立的 Conn 对象

或者

SqlCommand cmd = new SqlCommand ( CommandText , ConnecionObject );

另外还有一个包含三个参数的构造函数,我们不讨论。设计到的是事务处理。

有了 Command 对象以后我们须要执行操作,但是执行前请一定记得打开你的数据库连接,否则会有异常。 SqlCommand 对象提供下面 4 个执行方法:

l ExecuteNonQuery

l ExecuteScalar

l ExecuteReader

l ExecuteXmlReader

ExecuteNonQuery 方法执行不返回结果的命令,通常使用它执行插入、删除、更新操作。

例如我们对 contract 数据库进行操作:

string sqlIns = “insert [friend] (Fname,Fphone,Faddress) values (‘ 雪冬寒 ’,’027 -87345555’ ,’ 武汉大学宏博公寓 ’);

cmd.CommandText = sqlIns;

cmd.ExecuteNonQuery();

string sqlUpdate = “update [frined] set Faddress = ‘ 武汉大学 ’ where Fid = 1” ;

cmd.CommandText = sqlUpdate;

cmd.ExecuteNonQuery();

string sqlDel = “delete from [friend] where Fid = 1;

cmd.CommandText = sqlDel;

cmd.ExecuteNonQuery();

注:如果你要测试以上代码,请自己书写,不要复制和粘贴,这样会存在文字错误(汉语和英语的符号问题)。

ExecuteScalar 方法执行返回单个值的命令,例如我们须要统计系统中所有联系人的数量,就可以这样:

SqlCommand cmd = new SqlCommand(“select count(*) from friend”, Conn);

Conn.open();

int friendCount = (int) cmd.ExecuteScalar();

MessageBox.Show(“ 共 ” + friendCount.ToString() + “ 个联系人 ”);

说明:命令可以返回多个结果,此时 ExecuteScalar 方法将返回第一行第一个字段的值,同时其他所有值不可访问,这意味着如果象获得最好的性能,您应该构造适当的 select 查询,以便查询的结果集中尽可能少的包含额外的数据。如果只对单个返回值感兴趣,这个方法是首选的方法。另外该方法返回 object 类型数据,所有保证进行适当的类型转换是您的责任,否则您将得到异常。

ExecuteXmlReader 方法执行返回一个 xml 字符串的命令。它将返回一个包含所返回的 sml 的 System.Xml.XmlReader 对象。这个方法我一无所知,不作讨论 ^_^ 。

(由于文章不能操作64k,我只能分开贴)

Published At
Categories with Web编程
Tagged with
comments powered by Disqus