.net - net - llenar datatable c# desde sql
¿DataAdapter.Fill() cierra su conexión cuando se lanza una excepción? (2)
Estoy usando ADO.NET (.NET 1.1) en una aplicación heredada. Sé que DataAdapter.Fill () abre y cierra las conexiones si la conexión no se ha abierto manualmente antes de que se asigne al DataAdapter.
Mi pregunta: ¿También cierra la conexión si el .Fill () causa una excepción? (debido a que SQL Server no puede ser alcanzado, o lo que sea). ¿Tiene una fuga en una conexión o tiene una cláusula final incorporada para asegurarse de que la conexión se está cerrando?
Ejemplo de código:
Dim cmd As New SqlCommand
Dim da As New SqlDataAdapter
Dim ds As New DataSet
cmd.Connection = New SqlConnection(strConnection)
cmd.CommandText = strSQL
da.SelectCommand = cmd
da.Fill(ds)
No cierra la conexión. Este ejemplo funciona y genera el ID de "ARealTable"
using (SqlConnection conn = new SqlConnection("Data Source=server;Initial Catalog=database;user id=sa; password=password;"))
{
conn.Open();
try
{
SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM NotATable", conn);
/* Exception thrown next */
adap.Fill(new DataSet("test"));
}
catch (Exception) { }
using (SqlCommand cmd = new SqlCommand("SELECT TOP 1 Id FROM ARealTable", conn))
{
string result = Convert.ToString(cmd.ExecuteScalar());
Console.WriteLine(result);
}
Console.ReadKey();
Editar:
Si abre la conexión de antemano (llamando a Abrir en el objeto IDbConnection), el IDataAdapter no lo cerrará. Sin embargo, si permite que IDataAdapter administre la conexión por completo, se cerrará.
Si la conexión está abierta antes de que se llame al método Fill (), entonces no, el DataAdapter no cerrará la conexión.
Sin embargo, si no abre explícitamente la conexión y, en su lugar, permite que el DataAdapter abra y cierre la conexión con el comando Fill (), la conexión se cerrará por error.
Esto puede ser implícito desde múltiples fuentes de documentación, incluida esta: Estrategias de acceso a datos mediante ADO.NET y SQL
Además, esto se puede demostrar en el código escribiendo una rutina que generará errores y luego verificará el estado de la conexión.
Este código de una aplicación de Windows Forms lo demuestra. El primer cuadro de mensaje dirá "Abrir" y el segundo "Cerrado".
string connString = "";
private void Form1_Load(object sender, EventArgs e)
{
connString = Properties.Settings.Default.EventLoggingConnectionString;
ExplicitlyOpenConnection();
LetDataAdapterHandleIt();
}
private void ExplicitlyOpenConnection()
{
System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString);
System.Data.DataSet ds = new DataSet();
System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn);
cn.Open();
try
{
ad.Fill(ds);
}
catch (Exception ex)
{
}
MessageBox.Show(cn.State.ToString());
cn.Close();
}
private void LetDataAdapterHandleIt()
{
System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection(connString);
System.Data.DataSet ds = new DataSet();
System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("Select bogusdata from nonexistenttable", cn);
try
{
ad.Fill(ds);
}
catch (Exception ex)
{
}
MessageBox.Show(cn.State.ToString());
}