复习数据库开发

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

posted @   太一吾鱼水  阅读(296)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2012-09-12 Skyline Globe——初识庐山真面目
点击右上角即可分享
微信分享提示