Estoy tratando de obtener información de columna en C# desde una tabla SQL en SQL Server. Estoy siguiendo el ejemplo en este enlace: http://support.microsoft.com/kb/310107 Mi programa extrañamente se cuelga cuando intenta cerrar la conexión. Si la conexión no está cerrada, el programa se cierra sin ninguna excepción. Aquí está mi código:¿Por qué mi aplicación se bloquea al intentar cerrar un objeto SqlConnection?
SqlConnection connection = new SqlConnection(@"MyConnectionString");
connection.Open();
SqlCommand command = new SqlCommand("SELECT * FROM MyTable", connection);
SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo); // If this is changed to CommandBehavior.SchemaOnly, the program runs fast.
DataTable table = reader.GetSchemaTable();
Console.WriteLine(table.Rows.Count);
connection.Close(); // Alternatively If this line is commented out, the program runs fast.
Poner el SqlConnection
dentro de un bloque usando también hace que la aplicación se bloquee a menos CommandBehavior.KeyInfo
se cambia a CommandBehavior.SchemaOnly
.
using (SqlConnection connection = new SqlConnection(@"MyConnectionString"))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT * FROM MyTable", connection);
SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo); // If this is changed to CommandBehavior.SchemaOnly, the program runs fast even here in the using
DataTable table = reader.GetSchemaTable();
Console.WriteLine(table.Rows.Count);
}
La tabla en cuestión tiene más de 3 millones de filas, pero como yo no soy más que la obtención de la información de esquema, yo creo que esto no sería un problema. Mi pregunta es: ¿Por qué mi aplicación se atasca al intentar cerrar una conexión?
SOLUCIÓN: Quizás esto no sea óptimo, pero funciona; He insertado un comunicado command.Cancel();
justo antes Close
se llama al conectar:
SqlConnection connection = new SqlConnection(@"MyConnectionString");
connection.Open();
SqlCommand command = new SqlCommand("SELECT * FROM MyTable", connection);
SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo); // If this is changed to CommandBehavior.SchemaOnly, the program runs fast.
DataTable table = reader.GetSchemaTable();
Console.WriteLine(table.Rows.Count);
command.Cancel(); // <-- This is it.
connection.Close(); // Alternatively If this line is commented out, the program runs fast.
Puede compartir la cadena de conexión (excluyendo detalles delicados como nombre de usuario, contraseña, servidor y base de datos) para ver si está configurando cualquier otra variable que pueda alargar el proceso de cierre. –
Claro. Aquí está: @ " Fuente de datos = ****; Catálogo inicial = ****; ID de usuario = ****; Contraseña = ****; Tiempo de espera de conexión = 60;" –
¿No debería cerrar el lector primero? – Deb