DataReader не закрывается, когда соединение закрыто, последствия? - PullRequest
4 голосов
/ 31 мая 2011

например у меня есть этот код:

Sub Month()
    Dim Conn As New Data.OracleClient.OracleConnection
    Conn.Open()
    Try

        Dim Cmd As New Data.OracleClient.OracleCommand
        With Cmd
            .Connection = Conn
            .CommandType = Data.CommandType.Text
            .CommandText = "SELECT * FROM MONTH"
        End With
        Dim datareader As Data.OracleClient.OracleDataReader = Cmd.ExecuteReader
        While datareader.Read
            Response.Write(datareader(0))
        End While
    Catch ex As Exception
        Throw ex
    Finally
        Conn.Close()
    End Try
End Sub

Что будет с устройством чтения данных при закрытии соединения (Conn.close)

Будет ли освобожден Курсор, используемый устройством чтения данных? или он останется открытым?

Если курсор, используемый устройством чтения данных, все еще открыт, когда он будет автоматически закрыт? или я должен просто закрыть его вручную?

Приведет ли это к ужасному «ORA-01000: превышено максимальное количество открытых курсоров»?

спасибо заранее

Ответы [ 4 ]

1 голос
/ 23 октября 2012

Просто создайте новый объект для чтения данных после его закрытия

private void button2_Click(object sender, EventArgs e)
    {
        //SqlConnection cn1 = new SqlConnection();
        cn.ConnectionString = "server = .\\SQLEXPRESS ; database=store ; integrated security = true  ";
        SqlCommand cm = new SqlCommand("select * from emp", cn);
        cn.Open();
        SqlDataReader dr = cm.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Load(dr);
        dataGridView1.DataSource = dt.DefaultView ;
        //SqlCommand cm3 = new SqlCommand("select * from emp", cn1);
        SqlDataReader dr1 = cm.ExecuteReader();
        listBox1.Items.Clear();
        while (dr1.Read())
        {
            //listBox1.Items.Add(dr.GetString(2));
            listBox1.Items.Add(dr1["name"]);

        }
        cn.Close();
    }
1 голос
/ 31 мая 2011

Вы должны создать объекты в блоке using, чтобы они правильно располагались:

Using Conn As New Data.SqlClient.SqlConnection
    Conn.Open()

    Dim Cmd As New Data.SqlClient.SqlCommand
    With Cmd
        .Connection = Conn
        .CommandType = Data.CommandType.Text
        .CommandText = "SELECT * FROM MONTH"
    End With

    Using datareader As Data.SqlClient.SqlDataReader = Cmd.ExecuteReader()
        While datareader.Read()
            Response.Write(datareader(0))
        End While
    End Using
End Using

Нет необходимости вызывать Close ни для соединения, ни для устройства чтения данных.

1 голос
/ 31 мая 2011
CommandBehavior.CloseConnection

Когда вы передаете вышеуказанные значения в качестве аргумента в ExecuteReader 1. Нет необходимости явно закрывать соединение, закрытие соединения при закрытии читателя

проверить полный пост: http://pranayamr.blogspot.com/2010/11/executereader-with-commanbehavior.html

0 голосов
/ 31 мая 2011

Почему бы вам явно не закрыть читатель следующим образом.

datareader.Close ()

Dim Conn As New Data.SqlClient.SqlConnection
Conn.Open()
Try

    Dim Cmd As New Data.SqlClient.SqlCommand
    With Cmd
        .Connection = Conn
        .CommandType = Data.CommandType.Text
        .CommandText = "SELECT * FROM MONTH"
    End With
    Dim datareader As Data.SqlClient.SqlDataReader = Cmd.ExecuteReader
    While datareader.Read
        Response.Write(datareader(0))
    End While
    datareader.Close()
Catch ex As Exception
    Throw ex
Finally
    Conn.Close()
End Try
...