2015-08-18 2 views
0

J'ai deux bases de données distinctes auxquelles je me connecte en utilisant linq et EF6. Je cours également certaines procédures stockées. Pour des raisons de vitesse, j'utilise l'ancienne école de l'exécution de ces utilisant la méthode suivante:Délai d'appel de la procédure stockée via SqlConnection

public static DataSet ExecuteStoredProcedure(object db, string storedProcedureName, IEnumerable<SqlParameter> parameters) 
    { 
     string connectionString=""; 

     if (db is AriaEntities) 
     { 
      connectionString = ((AriaEntities)db).Database.Connection.ConnectionString; 
     } 
     else if (db is AMSEntities) 
     { 
      connectionString = ((AMSEntities)db).Database.Connection.ConnectionString; 
     } 

     var ds = new DataSet(); 

     using (var conn = new SqlConnection(connectionString)) 
     { 
      using (var cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = storedProcedureName; 
       cmd.CommandType = CommandType.StoredProcedure; 
       foreach (var parameter in parameters) 
       { 
        cmd.Parameters.Add(parameter); 
       } 

       using (var adapter = new SqlDataAdapter(cmd)) 
       { 
        adapter.Fill(ds); 
       } 
      } 

      conn.Close(); 
     } 

     return ds; 
    } 

Je passe à la connexion de base de données que je suis actuellement à l'aide. Le problème que j'ai, c'est que lorsque j'essaie d'exécuter une procédure stockée sur le contexte DB AMSEntities, je reçois un délai d'attente, même si la procédure elle-même ne prend qu'une seconde à s'exécuter manuellement dans SQL Server. J'ai des permissions d'exécution sur la procédure stockée et je peux accéder aux tables dans le datacontext sans problème en utilisant linq.

Pourquoi le message de dépassement de délai se produit-il?

Rob

+0

Je suppose que c'est un problème de réseau. Votre instance SQL Server est-elle sur une machine différente de votre application? Et la procédure stockée renvoie-t-elle une grande quantité de données? –

+0

La connexion utilisée par EF est-elle ouverte et une transaction est-elle ouverte? Cela ressemble à un interblocage distribué entre les deux connexions, – usr

+0

J'ai examiné de plus près la procédure stockée et trouvé qu'il y avait une requête à travers un serveur lié. J'ai supprimé ce bit et la requête n'était plus lente ... –

Répondre

1

Essayez d'ajouter un conn.Open(); Le DbContext ouvre seulement une connexion lorsque vous SubmitChanges ou énumèrent une requête.

+0

Malheureusement, cela n'a pas fait de différence. Il se trouve juste à la ligne Adapter.Fill avant de sortir. Cela fonctionne correctement pour toute procédure exécutée dans le DBContext d'AriaEntities. –

+0

L'une de vos tables est-elle verrouillée? Est-ce que cela se produit pour une seule procédure stockée ou tout? – Dan

+0

Pas de tables verrouillées du tout, je peux exécuter le sp de SSMS. –

0

Comme indiqué dans un commentaire ci-dessus, il s'est avéré être une référence masquée à un serveur lié dans la procédure stockée qui provoquait l'exécution de requête lente. Heureusement, je pourrais l'enlever car il s'est avéré que le code existant n'est plus nécessaire.