1、当SqlDataReader没有关闭之前,数据库连接会一直保持open状态,所以在使用SqlDataReader时,使用完毕应该马上调用SqlDataReader.Close()关闭它。
2、一个连接只能被一个SqlDataReader使用,这也是为什么要尽早关闭SqlDataReader的原因。
3、使用完SqlDataReader后,你可以在程序中显示的调用数据库连接对象的Close方法关闭连接,也可以在调用Command对象的ExecuteReader方法时传递CommandBehavior.CloseConnection 这个枚举变量,这样在调用SqlDataReader的Close方法时会自动关闭数据库连接。
4、使用SqlDataReader时尽量使用和数据库字段类型匹配的方法来取得相应的值,比如对于整形的字段使用GetInt32,对字符类型的字段使用GetString。这样会减少因为类型不一致而额外增加的类型转换操作。
5、使用SqlDataReader获取多条记录时,如果没有访问到取出记录的末尾时想要关闭SqlDataReader,应该先调用Command对象的Cancel方法,然后再调用SqlDataReader的Close方法。Command对象的Cancel方法使得数据库不再把SqlDataReader中未访问的数据发送到调用端,如果不调用此方法直接关闭SqlDataReader,数据库会发送和SqlDataReader未访问数据等长的空数据流到调用端。
6、如果想通过SqlCommand的ExecuteReader方法获取存储过程的返回值或者输出参数,必须先调用SqlDataReader的Close方法后,才能获取输出参数的值或者返回值。
7、如果使用SqlDataReader只返回一条记录,那么在调用Command的ExecuteReader方法时,指定
CommandBehavior.SingleRow参数,这个参数的是否使用对SQL Server .NET Data Provider没有什么影响,但是当你使用OLE DB .NET Data Provider时,指定这个参数后,DataPrivider内部将使用IRow接口,而不是使用相对来说耗费资源的IRowSet接口。
这部分来自其他网上资料,但是自己测试却发现真实情况不是这样。
本人这样测试,数据库操作类做长连接,也就是整个客户端程序只用一个数据库连接保持打开不关闭。客户端开启三个不同线程通过该打开的数据库连接获取数据,使用dataRead,用后不关闭dataRead和数据连接,未见异常,程序内存没有变大,数据库会话也只有一个。
数据库操作类
///
///数据库操作类///
classDBHelper
{//长连接是否打开
bool connet = false;public string connstr = "Data Source=ORCL;uid=admin;pwd=jxdflp";//数据库链接对象
private OracleConnection Conn = null;publicDBHelper()
{
InitConnection();
Thread tr=newThread(testConncet);
tr.IsBackground=true;
tr.Start();
}//初始化数据库链接
private voidInitConnection()
{try{//如果连接对象不存在,创建连接
if (Conn == null)
Conn= newOracleConnection(connstr);//如果连接对象关闭,打开连接
if (Conn.State ==ConnectionState.Closed)
Conn.Open();//如果连接中断,重启连接
if (Conn.State ==ConnectionState.Broken)
{
Conn.Close();
Conn.Open();
}
connet= true;
}catch(Exception ex)
{
ClassVar.WriteErrorLog(ex.ToString());
}
}//测试长连接线程
private voidtestConncet()
{while (true)
{try{string sql = "select 1 from dual";
OracleDataReader read=GetDataReader(sql);if(read.Read())
{
connet= true;
}else{
connet= false;
InitConnection();
}
}catch(Exception ex)
{
ClassVar.WriteErrorLog(ex.ToString());
}
Thread.Sleep(100);
}
}//查询,获取DataReader
public OracleDataReader GetDataReader(stringsqlStr)
{
OracleDataReader read=null;try{
OracleCommand cmd= newOracleCommand(sqlStr, Conn);
read=cmd.ExecuteReader();
}catch(Exception ex)
{
ClassVar.WriteErrorLog(ex.ToString());
}returnread;
}}
界面类
1 public partial classForm1 : Form2 {3
4 DBHelper db;5 publicForm1()6 {7 InitializeComponent();8
9 db = newDBHelper();10 Thread tr = newThread(test);11 tr.IsBackground = true;12 tr.Start();13
14 Thread tr1 = newThread(test2);15 tr1.IsBackground = true;16 tr1.Start();17
18 Thread tr2 = newThread(test3);19 tr2.IsBackground = true;20 tr2.Start();21 }22
23
24 private voidtest()25 {26 while (true)27 {28 string sql = "select * from JZFWXX t";29 OracleDataReader read=db.GetDataReader(sql);30 Thread.Sleep(5);31 }32 }33
34 private voidtest2()35 {36 while (true)37 {38 string sql = "select * from JZRXX t";39 OracleDataReader read =db.GetDataReader(sql);40 Thread.Sleep(5);41 }42 }43
44 private voidtest3()45 {46 while (true)47 {48 string sql = "select * from MJSBXX t";49 OracleDataReader read =db.GetDataReader(sql);50 Thread.Sleep(5);51 }52 }53 }