DataReader not closed when Connection is closed, consequences?
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 fre开发者_如何学Goed ? 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
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.
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
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();
}
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
精彩评论