7
votes

Il y a déjà un digne d'accès ouvert associé à cette commande qui doit être fermée en premier

C'est le code que j'ai.

/// <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;
}


2 commentaires

Changer cette ligne SQLMD.PARAMETERS.Ajouter ("@ plombinfoid", sqldbtype.int) .Value = plombid; à SQLMD.PARAMETERS.Adddithavalue ("@ plombinfoid", plomb); Si vous souhaitez conserver la connexion globale, vérifiez l'état de cette connexion si vous êtes ouvert, puis fermez-le avant de l'utiliser. Refactorez votre code et utilisez des noms de variables significatifs ....! Enveloppez votre connexion autour d'une utilisation () {}


SQLCMD sera exécuté pendant la journée. m_constr semble être une variable mal nommée - il semble se référer à la connexion elle-même, pas la chaîne de connexion.


4 Réponses :


1
votes

Vous essayez d'exécuter plusieurs ensembles de résultats actines (AKA mars ).

Deux solutions possibles viennent à l'esprit:

  1. Ouvrez Ouvrir une nouvelle connexion dans votre getContracTreSultCylead
  2. Activez Mars sur votre serveur de base de données (décrit dans le lien ci-dessus).

1 commentaires

Vous pouvez également essayer d'ajouter ceci dans le Web.config dans la chaîne de connexion: Connexionstring = "MultiLeAcTiverSultsUtsTets = true; utilisateur = ..."



9
votes

Votre problème est que vous avez apparemment une instance de m_constr code>; Si la méthode s'appelle simultanément, une seule d'entre elles sera en mesure d'utiliser la connexion et l'autre échouera avec l'exception que vous recevez.

Utilisez ce modèle à la place: P>

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


1 commentaires

"Ne définissez pas la connexion en tant que variable globale": mais comment éviter de créer et d'ouvrir une connexion à tout moment, je dois exécuter un SP. Dans mon cas, je dois exécuter beaucoup de SP, et sans l'instance de la connexion, l'alternative consiste à créer et à ouvrir à chaque fois. Toute astuce?



5
votes

Je suggère que vous puissiez utiliser un bloc pour assurer une disposition appropriée de SQLConnection.

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


1 commentaires

La connexion doit être déclarée localement (toutes sortes d'effets secondaires se produiront si vous utilisez une instance partagée). En outre, pourquoi n'emploiologisiez-vous pas simplement une déclaration utilisée pour gérer la durée de vie de la connexion?



5
votes

Tous vos objets idissibles de courte durée, il manque un "utilisation". Par extension, il est donc possible que vous ayez fait quelque chose comme: xxx

mais cela ne dispose pas / ferme le lecteur. Si tel est le cas, ajoutez "en utilisant": xxx

qui ferme le lecteur, quelle que soit la façon dont nous sortons. Les commandes, les connexions, les lecteurs et les transactions sont toutes jetables et doivent tous utiliser généralement "en utilisant".


0 commentaires