4

たとえば、私はこのコードを持っています:

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 )、データリーダーはどうなりますか?

datareader が使用する Cursor は解放されますか? それとも開いたままですか?

データリーダーが使用するカーソルがまだ開いている場合、いつ自動的に閉じられますか? または、手動で閉じる必要がありますか?

恐ろしい「ORA-01000: 開いているカーソルの最大数を超えました」が発生しますか?

前もって感謝します

4

4 に答える 4

2

オブジェクトが適切に破棄されるように、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 を呼び出す必要はありません。

于 2011-05-31T16:36:18.627 に答える
1

閉じた後、データリーダーの新しいオブジェクトを作成するだけです

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();
    }
于 2012-10-23T09:50:31.100 に答える
1
CommandBehavior.CloseConnection

上記の値を引数として ExecuteReader 1 に渡すと、接続を明示的に閉じる必要はありません。リーダーを閉じるときに、接続を閉じます。

投稿全体を確認してください: http://pranayamr.blogspot.com/2010/11/executereader-with-commanbehavior.html

于 2011-05-31T04:03:41.260 に答える
0

このように明示的にリーダーを閉じてはいけません。

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
于 2011-05-31T05:13:05.020 に答える