2010-01-14 4 views
1

en cours d'exécution sqlbulkcopy dans C# et j'obtiens une erreur: WriteToServer: propriété de connexion n'a pas été initialisée.WriteToServer: la propriété Connection n'a pas été initialisée. sqlbulkcopy erreur

cela se passe à la commande WriteToServer. La connexion est ouverte.

using (SqlBulkCopy s = new SqlBulkCopy(conn)) 
{ 
    foreach (DataTable dt in ds.Tables) 
    { 

    s.DestinationTableName = "tmp_" + dt.TableName; 
    s.NotifyAfter = 5000; 
    s.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied); 
    s.WriteToServer(dt); 
    s.Close(); 
    } 
} 

code correct:

using (SqlBulkCopy s = new SqlBulkCopy(conn)) 
{ 
    foreach (DataTable dt in ds.Tables) 
    { 
    s.DestinationTableName = "tmp_" + dt.TableName; 
    s.NotifyAfter = 5000; 
    s.SqlRowsCopied += new SqlRowsCopiedEventHandler(s_SqlRowsCopied); 
    s.WriteToServer(dt); 
    } 
    s.Close(); 
} 
+0

Vous pouvez vous débarrasser complètement de 's.Close()'. Voir le commentaire que j'ai laissé sur la réponse @ Yooder. –

Répondre

1

En bref, je suppose que le premier passage dans la boucle foreach exécute correctement, s.Close(); est le nettoyage de l'instance SqlBulkCopy et compensation sa propriété Connection, ainsi créer l'exception sur le second passage.

+0

En outre, il n'est pas nécessaire de le fermer explicitement. L'appel 's.Close()' peut être entièrement supprimé puisque SqlBulkCopy implémente 'IDisposable', donc le bloc' using' existant va se fermer et s'en débarrasser. –

+1

Je le laisserais dedans, la fermeture explicite est redondante - mais il est bon d'avoir juste au cas où le bloc 'using' disparaitrait d'une manière ou d'une autre. Personnellement ma préférence est de laisser les petites optimisations au compilateur (c'est plutôt excitant) et de garder le code aussi lisible et clair que possible – STW

Questions connexes