使用查询返回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代码反编译为源代码,让我们轻松地确定给定的方法的作用。