在ExecuteReader之后关闭OracleConnection

时间:2014-10-06 23:20:49

标签: c# .net oracle ado.net

这是我目前的模式

private void ReadData(string connString, string cmdString)
{
    using (OracleConnection conn = new OracleConnection(connString))
    {
        conn.Open();
        OracleCommand cmd = new OracleCommand(cmdString, conn);
        OracleDataReader reader = cmd.ExecuteReader();
        //some long operation using reader
    }
}

在上述情况下,长时间操作时连接保持打开状态。有没有办法可以关闭连接,但仍然保留读者。这会有利吗?

1 个答案:

答案 0 :(得分:0)

如果通过长操作表示您需要对数据库执行额外操作(如更新/插入/删除),则无法关闭连接。

如果您想读取数据并根据它进行一些计算,那么您应该将模式修改为:1。读取所有数据,2。关闭连接,3。对数据进行长时间操作。

using System;
using System.Collections.Generic;
using Oracle.DataAccess.Client;

namespace Utils
{
    class Test
    {
        private class Class
        {
            public string FirstProperty { get; set; }
            public string SecondProperty { get; set; }
        }

        private void ReadData(string connString, string cmdString)
        {
            List<Class> data = new List<Class>();
            using (OracleConnection conn = new OracleConnection() { ConnectionString = connString })
            using (OracleCommand objCmd = new OracleCommand()
            {
                Connection = conn,
                CommandText = cmdString
            })
            {
                try
                {
                    conn.Open();
                }
                catch (OracleException)
                {
                    OracleConnection.ClearPool(conn);
                    conn.Open();
                }
                using (OracleDataReader dataReader = objCmd.ExecuteReader())
                {
                    while (dataReader.Read())
                        data.Add(new Class()
                        {
                            FirstProperty = dataReader.GetString(0),
                            SecondProperty = dataReader.GetString(1)
                        });
                }
                conn.Close();
            }
            //some long operation using data
        }
    }
}