使用查询返回DataReader的时候需要注意,如果关闭了Connection对象,返回的DataReader也会关闭。
所以如下写法都会出现错误:
public static OracleDataReader ExecuteQueryDataReader2(string sql) { using (OracleConnection conn = new OracleConnection(ConnectionString)) { try { conn.Open(); if (conn.State == ConnectionState.Open) { OracleCommand cmd = new OracleCommand(); cmd.CommandType = CommandType.Text; cmd.Connection = conn; cmd.CommandText = sql; OracleDataReader dareader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return dareader; } } catch (Exception) { throw; } } return null; }
1 /// <summary>
2 /// 查询,返回OracleDataReader 3 /// </summary>
4 /// <param name="sql"></param>
5 /// <returns></returns>
6 public static OracleDataReader ExecuteQueryDataReader(string sql) 7 { 8 OracleConnection conn = new OracleConnection(ConnectionString); 9 try
10 { 11 conn.Open(); 12 if (conn.State == ConnectionState.Open) 13 { 14 OracleCommand cmd = new OracleCommand(); 15 cmd.CommandType = CommandType.Text; 16 cmd.Connection = conn; 17 cmd.CommandText = sql; 18 OracleDataReader dareader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 19 return dareader; 20 } 21 } 22 catch (Exception) 23 { 24 throw; 25 } 26 finally
27 { 28 if (conn.State != ConnectionState.Closed) 29 { 30 conn.Close(); 31 } 32 33 } 34 return null; 35 }
正确写法:
1 public static OracleDataReader ExecuteQueryDataReader(string sql) 2 { 3 OracleConnection conn = new OracleConnection(ConnectionString); 4 try 5 { 6 conn.Open(); 7 if (conn.State == ConnectionState.Open) 8 { 9 OracleCommand cmd = new OracleCommand(); 10 cmd.CommandType = CommandType.Text; 11 cmd.Connection = conn; 12 cmd.CommandText = sql; 13 OracleDataReader dareader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 14 return dareader; 15 } 16 } 17 catch (Exception) 18 { 19 conn.Close(); 20 throw; 21 } 22 return null; 23 }
调用该方法时需要注意,将返回的DataReader对象关闭,这样同时会关闭Connection对象。
下面的说法,http://hi.baidu.com/dragonnet/item/db6f22d8a59b8b17d90e44e7
使用using可以确保连接对象关闭连接。这个我不确定,应该是这样吧。
1 string connStr = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false", @"192.168.8.196", @"robot", @"robot", @"robot"); 2 using(conn = new MySqlConnection(connStr)) 3 { 4 //Open the connection
5 conn.Open(); 6
7
8 //Do somthing useful
9 }
在这个实例中,无论块是如何退出的,using子句都会确保关闭数据库连接。查看一下连接类的Dispose()方法的IL代码,它们都检查连接对象的当前状态,如果其状态为打开,就调用Close()方法。浏览.NET程序集的一个强大工具是Reflector(可以从/www.aisto.com/roeder/dotnet/上获得)。这个工具允许查看任何.NET方法的IL代码,还可以把IL代码反编译为源代码,让我们轻松地确定给定的方法的作用。