2012-01-26 17 views
7

Este es el código que tengo.Ya hay un DataReader abierto asociado con este comando que debe cerrarse primero

/// <summary> 
/// Method calls stored procedure and fills DataSet of contacts associated with Lead 
/// </summary> 
/// <param name="leadID">The ID associated with a Lead</param> 
/// <returns>contacts list as DataSet</returns> 
public static DataSet GetContactResultSetByLead(int leadID) 
{ 
    SqlCommand Sqlmd = new SqlCommand("dbo.proc_contact"); 
    Sqlmd.CommandType = CommandType.StoredProcedure; 
    Sqlmd.Parameters.Add("@LeadInfoID", SqlDbType.Int).Value = leadID; 

    Sqlmd.Connection = m_ConStr; 
    SqlDataAdapter da = new SqlDataAdapter(Sqlmd); 

    DataSet data = new DataSet(); 
    try 
    { 
     da.Fill(data); 
    } 

    finally 
    { 
     m_ConStr.Close(); 
    } 

    return data; 
} 
+0

¿Qué es 'm_ConStr'? –

+0

cambie esta línea Sqlmd.Parameters.Add ("@ LeadInfoID", SqlDbType.Int) .Value = leadID; a Sqlmd.Parameters.AddWithValue ("@ LeadInfoID", leadID); Si desea mantener Global Connect, verifique el estado de esa conexión, si está abierta, luego ciérrela antes de usarla. ¡REFACTIVA TU CÓDIGO Y UTILIZA SIGNIFICATIVOS NOMBRES VARIABLES ...! Envuelva su conexión alrededor de using() {} – MethodMan

+1

Sqlmd se ejecutará durante la llamada da.Fill. m_ConStr parece ser una variable poco nombrada: parece referirse a la conexión en sí, no a la cadena de conexión. – RQDQ

Respuesta

9

Su problema es que aparentemente tiene una instancia de m_ConStr; si el método se llama concurrentemente, solo uno de ellos podrá usar la conexión y el otro fallará con la excepción que está recibiendo.

utilizar este modelo en su lugar:

using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.Open(); 
    Sqlmd.Connection = conn; 
    SqlDataAdapter da = new SqlDataAdapter(Sqlmd); 
    //...etc 
} 

En otras palabras, no definen la conexión como una variable global a la clase.

+0

"no define la conexión como una variable global": pero luego cómo evitar crear y abrir una conexión cada vez que tengo que ejecutar una sp. En mi caso, tengo que ejecutar una gran cantidad de sp, y sin instanciar una conexión, la alternativa es crear y abrir todo el tiempo. ¿Algún consejo? – ff8mania

1

Usted está tratando de ejecutar varios conjuntos de resultados ACTICE (también conocido como MARS).

dos soluciones posibles vienen a la mente:

  1. abierto abierto una nueva conexión en su GetContractResultSetByLead
  2. Habilitar MARS en el servidor de base de datos (que se describe en el siguiente enlace).
+0

También puede intentar agregar esto en el archivo web.config en la cadena de conexión: connectionString = "MultipleActiveResultSets = True; user = ..." – Nestor

5

sugiero que puede utilizar el bloque para asegurar la eliminación adecuada de sqlconnection.

using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.Open(); 
    Sqlmd.Connection = conn; 
    SqlDataAdapter da = new SqlDataAdapter(Sqlmd); 
    Dataset ds = new Datasest 
    da.Fill(ds) 
} 

A la inversa, también puede establecer la propiedad MARS en su conexión, si es necesario.

SqlConnection m_ConStr;= new SqlConnection("Server= serverName;Database=yourDatabase; 
     MultipleActiveResultSets=true;"); 
+2

La conexión debe declararse localmente (todo tipo de efectos secundarios ocurrirán si usa una instancia compartida). Además, ¿por qué no emplearías simplemente una declaración de uso para administrar la vida útil de la conexión? – RQDQ

+1

eso también es una buena sugerencia :) ok lo editará :) –

+1

Muchas gracias – Marcus3329

5

Todos sus objetos IDisposibles de vida corta carecen de un "uso". Por extensión, a continuación, es posible que usted ha hecho algo como:

var reader = anotherCommand.ExecuteReader(); 
... 

Pero esto no dispone/cierra el lector. Si este es el caso, agregue "usar":

using(var reader = anotherCommand.ExecuteReader()) { 
    ... 
} 

Lo que cierra el lector, independientemente de cómo salgamos. Los comandos, las conexiones, los lectores y las transacciones son todos desechables y todos deberían usar "usar".

Cuestiones relacionadas