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