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接口。
这部分来自其他网上资料,但是自己测试却发现真实情况不是这样。
本人这样测试,数据库操作类做长连接,也就是整个客户端程序只用一个数据库连接。客户端
/// <summary> /// 数据库操作类 /// </summary> class DBHelper { //长连接是否打开 bool connet = false; public string connstr = "Data Source=ORCL;uid=admin;pwd=jxdflp"; //数据库链接对象 private OracleConnection Conn = null; public DBHelper() { InitConnection(); Thread tr=new Thread(testConncet); tr.IsBackground=true; tr.Start(); } //初始化数据库链接 private void InitConnection() { try { //如果连接对象不存在,创建连接 if (Conn == null) Conn = new OracleConnection(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 void testConncet() { 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(string sqlStr) { OracleDataReader read=null; try { OracleCommand cmd = new OracleCommand(sqlStr, Conn); read= cmd.ExecuteReader(); } catch (Exception ex) { ClassVar.WriteErrorLog(ex.ToString()); } return read; } }
1 public partial class Form1 : Form 2 { 3 4 DBHelper db; 5 public Form1() 6 { 7 InitializeComponent(); 8 9 db = new DBHelper(); 10 Thread tr = new Thread(test); 11 tr.IsBackground = true; 12 tr.Start(); 13 14 Thread tr1 = new Thread(test2); 15 tr1.IsBackground = true; 16 tr1.Start(); 17 18 Thread tr2 = new Thread(test3); 19 tr2.IsBackground = true; 20 tr2.Start(); 21 } 22 23 24 private void test() 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 void test2() 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 void test3() 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 }