2010-11-15 8 views
2

Je me demandais comment vous pouvez insérer plusieurs lignes dans une base de données MySQL en utilisant une connexion au lieu d'ouvrir et de fermer plusieurs connexions. Les données insérées proviennent de string [], j'ai donc utilisé une boucle foreach pour accéder à chaque valeur.Insérer plusieurs lignes en utilisant la même connexion MySQL?

Ici mon courant non travail du code C#:

string[] tempfin = table.Split(','); 
string username = null; 
connection.Open(); 
foreach (object hope in tempfin) 
{ 
    command.CommandText = "INSERT INTO ATable (Tried, Username) VALUES" + "('" + hope + "','" + username + "')"; 
    command.ExecuteReader(); 
} 
connection.Close(); 

je pouvais ouvrir et fermer la connexion dans la boucle foreach, mais cela m'a été prouvé peu fiable pour l'insertion d'une grande quantité de lignes, donc est là un moyen insérer plusieurs lignes en utilisant une connexion en C#?

Mise à jour: Peu importe, j'ai trouvé mon problème. Il s'agissait d'utiliser command.ExecuteReader() au lieu de command.ExecuteNonQuery()

+0

Pourquoi pensez-vous que vous devez ouvrir et fermer plusieurs connexions? –

+0

pas sûr, mais les autres moyens que j'ai essayés ont fini par retenir les erreurs mysql telles que "la connexion existante doit être fermée" –

Répondre

5

Le code que vous avez posté utilise déjà une seule connexion. Je suggère d'utiliser une requête paramétrée à la place de celle que vous utilisez.

Pourquoi votre code ne fonctionne-t-il pas? Pouvez-vous mettre à jour votre question avec l'erreur que vous obtenez? Si vous émettez une commande d'insertion, vous devez utiliser ExecuteNonQuery au lieu de ExecuteReader.

2

Vous pouvez faire quelque chose comme ça avec MySQL:

INSERT INTO ATable (X, Y) VALUES (1, 2), (3, 4), (5, 6), (7, 8) 

qui insérera 4 lignes. Il suffit donc de mettre à jour votre code pour construire une seule instruction et de l'exécuter si vous êtes préoccupé par l'exécution de plusieurs instructions INSERT à la suite.

pas sûr, mais les autres façons essayées a fini par returing erreurs de MySQL telles que « connexion existante doit être fermé »

Ceci est probablement parce que vous utilisez ExecuteReader au lieu de ExecuteNonQuery comme Pablo Santa Cruz souligné.

+0

Vous devriez toujours modifier votre SQL à la solution de Sean parce qu'il est préférable d'exécuter plusieurs requêtes. – Webnet

+1

Plusieurs paramètres SQL sont-ils pris en charge ou dois-je créer la commande insert avec une chaîne de valeurs multiples? – OneWorld

1

Là, nettoyé un peu. Oui, il n'utilise qu'une seule connexion.

string[] tempfin = table.Split(','); 
    string username = null; 
    try 
    { 
     connection.Open(); 
     SQLParameter parUserName = new SqlParameter("@username", System.Data.SqlDbType.VarChar,100); 
     if(username != null) parUserName.Value = username; else parUserName.Value = DBNull.Value; 

     SQLParameter parHope = new SqlParameter("@hope", System.Data.SqlDbType.VarChar,256); 

     command.Parameters.Add(parUserName); 
     command.Parameters.Add(parHope); 

     command.CommandText = "INSERT INTO ATable (Tried, Username) VALUES (@hope,@username)"; 
     foreach (string hope in tempfin) 
     { 
      parHope.Value = hope; 
      command.ExecuteNonQuery(); 
     } 
    } 
    finally{ 
     if (connection.State != System.Data.ConnectionState.Closed) 
      connection.Close(); 
     if(command != null) 
      command.Dispose(); 
    } 
Questions connexes