2010-01-21 12 views
6

Estoy creando una Cola de ejecución de consultas DB automática, lo que esencialmente significa que estoy creando una cola de consultas SQL, que se ejecutan una por una.C# SqlDataReader Estadísticas e información de ejecución

Las consultas se ejecutan utilizando código similar al siguiente:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString)) 
{ 
    cn.Open(); 
    using (SqlCommand cmd = new SqlCommand("SP", cn)) 
    { 
    cmd.CommandType = CommandType.StoredProcedure; 
    using (SqlDataReader dr = cmd.ExecuteReader()) 
    { 
     while (dr.Read()) 
     { 

     } 
    } 
    } 
} 

Lo que me gustaría hacer es recoger la mayor cantidad de información posible sobre la ejecución. cuánto tiempo tomó. Cuantas filas fueron afectadas

Lo que es más importante, si FALLÓ, por qué falló.

Realmente puedo obtener cualquier tipo de información sobre la ejecución que deseo guardar.

+0

Tenga en cuenta que no es necesariamente un SP, podría ser una consulta como 'TRUNCATE TABLE daily_Stats', o un comando de actualización, o un comando de inserción –

Respuesta

7

intente utilizar el incorporado en las estadísticas del tiempo de ejecución y las filas seleccionadas/afectada:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString)) 
{ 
    cn.Open(); 
    cn.StatisticsEnabled = true; 
    using (SqlCommand cmd = new SqlCommand("SP", cn)) 
    { 
    cmd.CommandType = CommandType.StoredProcedure; 
    try 
    { 
     using (SqlDataReader dr = cmd.ExecuteReader()) 
     { 
     while (dr.Read()) 
     { 

     } 
     } 
    } 
    catch (SqlException ex) 
    { 
     // Inspect the "ex" exception thrown here 
    } 
    } 

    IDictionary stats = cn.RetrieveStatistics(); 
    long selectRows = (long)stats["SelectRows"]; 
    long executionTime = (long)stats["ExecutionTime"]; 
} 

Ver más en MSDN.

La única forma en que puedo ver que descubras cómo algo falló es inspeccionando el SqlException arrojado y mirando los detalles.

+0

¿Qué hay de los errores, debo envolver todo en un intento Catch y capturar la SqlException, o hay una manera más explícita de controlar si las cosas se ejecutan correctamente? –

+0

como Don lo sugirió a continuación –

+1

@Theofanis Pantelides: actualizado para mostrar dónde debería estar atrapando las excepciones de las ejecuciones. También debe colocar el bloque para 'cn.Open()' en un try-catch también, para evitar errores desagradables cuando falla la conexión. – Codesleuth

1

Si bien estoy un poco inseguro de cuál es realmente tu pregunta, con eso me refiero a si quieres una lista de estadísticas que podrían ser útiles para guardar o cómo obtener las estadísticas que mencionás arriba.

SqlDataReader tiene propiedades .RecordsAffected y .FieldCount que le dice un poco sobre la cantidad de datos que se devolvieron.

También puede ver el SqlException para obtener información acerca de qué (en todo caso) salió mal.

Cuestiones relacionadas