问题
for example i have this code :
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
What will happen to the datareader when the Connection is closed ( Conn.close)
Will the Cursor that is used by the datareader be freed ? or will it stay open ?
If the cursor that is used by the datareader is still open , when will it be automatically closed ? or should i just closed it manually ?
Will it cause the dreaded "ORA-01000: maximum open cursors exceeded" ?
thanks in advance
回答1:
CommandBehavior.CloseConnection
When you pass above values as argument to ExecuteReader 1. there is no need to close connection explicitly connection get close when you close your reader
check full post : http://pranayamr.blogspot.com/2010/11/executereader-with-commanbehavior.html
回答2:
You should create the objects in a using block so they are properly disposed:
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
There is no need to call Close on either the connection or the datareader.
回答3:
Just make new object of data reader after it been closed
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();
}
回答4:
Why shouldn't you explicitly close the reader like this.
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
来源:https://stackoverflow.com/questions/6182884/datareader-not-closed-when-connection-is-closed-consequences