复习数据库开发

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

原文地址:https://www.cnblogs.com/yhlx125/p/3316700.html