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; }
4 Réponses :
Vous essayez d'exécuter plusieurs ensembles de résultats actines (AKA mars ). P>
Deux solutions possibles viennent à l'esprit: p>
Vous pouvez également essayer d'ajouter ceci dans le Web.config dans la chaîne de connexion: Connexionstring = "MultiLeAcTiverSultsUtsTets = true; utilisateur = ..."
Votre problème est que vous avez apparemment une instance de Utilisez ce modèle à la place: P> 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.
using (SqlConnection conn = new SqlConnection())
{
conn.Open();
Sqlmd.Connection = conn;
SqlDataAdapter da = new SqlDataAdapter(Sqlmd);
//...etc
}
"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?
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;");
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?
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: mais cela ne dispose pas / ferme le lecteur. Si tel est le cas, ajoutez "en utilisant": p> 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". P> p>
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.