这次我们详细研究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,我只能分开贴)