2010-09-27 5 views
0

J'utilise le code suivant pour obtenir tous les enregistrements de données d'une base de données MS SQL et j'essaie de mettre à jour chaque enregistrement. Le code est utilisé dans un WebService. Le problème est, que le code fonctionne bien si j'ai 1000 enregistrements de données, mais maintenant j'ai 20000 enregistrements de données et le code retourné avec un délai d'attente. Ensuite, j'ai mis le cmd.CommandTimeout à zéro pour ne pas avoir de délai. Maintenant, quand j'appelle la fonction dans IE WebSvc la fenêtre d'IE est toujours vide et essaye toujours de charger quelque chose mais rien ne se produit. Seulement 150 datarecords sont mis à jour.Récupérer et mettre à jour 20000 enregistrements de données cesse de fonctionner

Avez-vous une idée de l'origine du problème? Le code n'est pas le meilleur, alors que devrais-je changer?

Merci beaucoup! WorldSignia

MyCode:

private string AddNewOrgBez() 
     { 
      try 
      { 
       SqlConnection sqlconn = new SqlConnection(this.connectionString); 
       SqlCommand cmd; 
       SqlDataReader reader; 
       sqlconn.Open(); 

       cmd = new SqlCommand("SELECT * FROM dbo.mydata", sqlconn); 
       cmd.CommandTimeout = 0; 
       reader = cmd.ExecuteReader(); 

       while (reader.Read()) 
       { 
        // Felder holen 
        string okuerzel = reader["O_KURZ"].ToString(); 
        string bezeichnung = reader["O_BEZ"].ToString(); 

        string[] lines = CreateNewOrgBez(bezeichnung); 

        string sqlcmd = "UPDATE dbo.mydata SET WEB_OBEZ1 = '" + lines[0] + "', WEB_OBEZ2 = '" + lines[1] + "', WEB_OBEZ3 = '" + lines[2] + "' WHERE O_KURZ = '" + okuerzel + "'"; 

        SqlConnection sqlconn2 = new SqlConnection(this.connectionString); 
        sqlconn2.Open(); 
        SqlCommand cmd2 = new SqlCommand(sqlcmd, sqlconn2); 
        cmd2.CommandTimeout = 0; 
        cmd2.ExecuteNonQuery(); 
        sqlconn2.Close(); 
       } 

       reader.Close(); 
       sqlconn.Close(); 

       return "OK"; 
      } 
      catch (Exception ex) 
      { 
       return ex.Message; 
      } 
     } 
+0

Vous ne pouvez pas créer sqlconn2 en dehors de la boucle? – pascal

+0

Que fait 'CreateNewOrgBez'? Avez-vous vraiment besoin de ramener tout cela à votre application, puis mettez-la à jour par une ligne agonisante dans sa propre transaction? –

+0

Une petite description: La fonction obtient un ensemble complet d'employés à partir d'une base de données et met à jour leur nom d'organisation. Les fonctions CreateNewOrgBez créent le nouveau nom sur un nom existant. Puis le nouveau nom qui est dans les lignes [] Array devrait être mis à jour aux champs WEB_OBEZ ... –

Répondre

0

Vous utilisiez deux connexions différentes pour lire et mettre à jour, et l'une d'entre elles en bloquait une autre. C'est pourquoi lorsque vous avez d'abord lu toutes vos données, cela a commencé à fonctionner.

0

je doute que votre course en OutOfMemoryException. Pouvez-vous profiler votre application et vérifier l'utilisation de la mémoire?

Puisque vous écrasez simplement les variables dans la boucle While, pourquoi n'essayez-vous pas de les retirer de la boucle.

2

Vous SqlCommand ici tous une fuite de - je vous suggère de revoir votre utilisation de SqlClient classes pour trouver ceux qui sont IDisposable et restructurer votre code pour assurer qu'ils sont toujours libérés, en utilisant la using construction.

Par exemple, cela assure Dispose est appelée, même s'il y a une exception dans le code entre crochets:

using (SqlCommand cmd2 = new SqlCommand(sqlcmd, sqlconn2)) 
{ 
    cmd2.CommandTimeout = 0; 
    cmd2.ExecuteNonQuery(); 
} 

En utilisant une nouvelle SqlConnection pour chaque mise à jour est trop cher, cela devrait se faire en dehors de la boucle. L'établissement de connexion redondant est probablement l'explication de votre délai d'attente. Prenez note du commentaire de @ ck selon lequel, pour des raisons d'efficacité, ce type d'opération côté client au coup par coup n'est pas aussi efficace que le gros du côté serveur. Vous devriez pouvoir améliorer ce code, mais cela ne veut pas dire que c'est la solution idéale/la plus rapide.

+0

J'ai changé ma partie de code à votre partie de code mais le problème existe toujours ...? –

1

J'ai trouvé le problème. Vous devez d'abord obtenir tous les enregistrements de données, par exemple dans un nouveau DataTable. La structure que j'ai utilisée ne fonctionne pas, car elle lit les données de la base de données et met également à jour la base de données. Après l'avoir changé en une nouvelle structure cela fonctionne.

Questions connexes