.net 连接关闭时DataReader未关闭,后果如何?

.net 连接关闭时DataReader未关闭,后果如何?,.net,database,vb.net,oracleclient,.net,Database,Vb.net,Oracleclient,例如,我有以下代码: 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.

例如,我有以下代码:

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会发生什么情况

datareader使用的游标是否会被释放?还是会一直开着

如果datareader使用的光标仍处于打开状态,它将在何时自动关闭?还是我应该手动关闭它

它会导致可怕的“ORA-01000:超过最大打开游标数”吗

提前谢谢

CommandBehavior.CloseConnection
当您将上述值作为参数传递给ExecuteReader时 1.无需显式关闭连接。当您关闭读卡器时,请关闭连接


检查全文:

为什么不这样明确地关闭阅读器

datareader.Close()


应在使用块中创建对象,以便正确放置:

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。

只需在数据读取器关闭后创建新对象即可

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();
    }

是的,确实如此,但如果只关闭连接而不关闭读卡器本身,会发生什么情况。@Garry-reader始终使用实时连接从数据库读取数据…如果关闭连接并尝试通过读卡器读取数据,则会抛出异常连接关闭,即如果在连接关闭时尝试访问它,读卡器使用的光标也会关闭吗?或者它会卡在oracle服务器上并导致“超过最大光标数”@Garry-检查以下答案:之前已经阅读过,但它仍然没有解释光标或我的其他问题将发生什么情况使用“vb.net命令并用于”C#“,这将自动关闭dr的连接,不关闭它会给公司带来巨大的风险performance@user751975VB.Net中的“With”与C#中的“using”不同。在VB.Net中,它被称为“使用”2014年,我对Oracle也有同样的问题。你找到答案了吗?我收到了这条可怕的消息,但是我所有的连接都是用using语句创建的(这与try..finally相同),我不确定在哪里可以找到答案。这就是我试图找到的,为什么我们必须关闭数据读取器,而连接本身将在FILLIND中关闭,我试图找出如果datareader像我的代码一样使用,会发生什么情况您应该在Using块中创建SqlConnection和datareader,因为它们都实现IDisposable。这样,当你用完它们时,它们会被妥善处理。
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();
    }