2010-12-09 95 views
0

Je ne sais pas beaucoup sur l'exportation de données en utilisant OLEDB, je me suis dit ce qui suit:Droit chemin d'exporter plusieurs enregistrements à accéder à l'aide OLEDB

using (OleDbConnection conn = new OleDbConnection(connString)) 
{ 
    try 
    { 
     conn.Open(); 
     foreach (T t in rows) 
     { 
     using(OleDbCommand oleDbCommand = new OleDbCommand(insertString, conn)) 
     { 
       OleDbParameter param = new OleDbParameter(.., ..); 
       oleDbCommand.Parameters.Add(param); 
       //add more parameters 
       oleDbCommand.ExecuteNonQuery(); 
     } 
     } 
    } 
    catch (Exception e) 
    { 
     //handle 
    } 
} 

Au début, je n'ai pas utilisé l'instruction à l'aide pour la OleDbCommand (c'est-à-dire que je n'ai pas disposé de OleDbCommand). Mais dans ce cas, un fichier de verrouillage d'enregistrement est resté sur la base de données même si j'avais fini d'exporter. Avec l'instruction (interne) Using, l'exportation semble toutefois plus lente. Pourquoi? Et comment obtenir à la fois l'exportation rapide et la suppression du verrouillage d'enregistrement à la fin de l'exportation?

Répondre

0

Étant donné que vous ne fermez pas la connexion, le fichier ldb reste présent lorsque vous êtes toujours connecté à la base de données. Donc, vous devriez mettre une instruction using autour de la déclaration de connexion (ou fermer la connexion dans le bloc finally de votre instruction try [qui est exactement ce que l'instruction using fait nb).

using(var conn = new OleDbConnection (connectionstring)) 
{ 
    conn.Open(); 

    using(cmd = conn.CreateCommand()) 
    { 
     cmd.Parameters.Add (..); 
     ... 

     for(...) 
     { 
      cmd.Parameters.Clear(); 
      cmd.CommandText = ""; 
      cmd.Parameters["@p_param"].Value = ... 

      cmd.ExecuteNonQuery(); 
     } 
    } 
} 

Avec la clause à l'aide de la boucle for, vous êtes la disposition de la OleDbCommand pour chaque enregistrement que vous allez insérer. Cependant, vous pouvez réutiliser l'instance OleDbCommand pour chaque insertion. (Voir le code ci-dessus).

En plus de cela, vous devez démarrer une transaction explicitement. Puisque, quand vous ne faites pas cela, une transaction implicite sera créée pour chaque instruction d'insertion. En outre, en effectuant toutes les insertions dans une transaction, vous serez en mesure d'annuler toutes les modifications (insertions) que vous avez effectuées lorsque vous rencontrez une erreur.
(Par exemple, si l'insertion de la ligne 159 échoue, vous pouvez annuler toutes les 158 insertions que vous avez effectuées auparavant).

+0

L'utilisation d'une transaction explicite rendra également l'exportation plus rapide? Ou cela me donnera-t-il seulement la possibilité de revenir en arrière? – willem

+0

Une autre chose: je ne peux pas utiliser un constructeur OleDbCommand avec seulement une connexion en paramètre. – willem

+0

Je viens de taper le code par coeur, donc effectivement, il est possible que la syntaxe ne soit pas entièrement correcte. –