复习数据库开发

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

你可能感兴趣的:(数据库)