-6
votes

Comment envoyer une quantité limitée d'inserts à la fois. C # system.data.sqlite

Je dois lire un fichier CSV (ce n'est pas le problème) et effectuez 10 insertions à la fois. Je ne sais pas combien de lignes le fichier CSV auront. J'ai essayé de faire une boucle et chaque mod 10 envoie un commit, mais après deux ou trois fois, le programme donne une erreur. Je n'ai pas d'idéie comment résoudre ce problème.

EDIT: P>

Désolé, je suis en train d'utiliser mon mobile, my My My Code est: P>

using (var connection = new SqliteConnection("conn-string"))
{
    connection.Open();
    using (var transaction = connection.BeginTransaction())
    {
        for (int i = 0; i < listCode.Count; i++)
        {
            string sql = $"insert into table1 (code) values ({listCode[i]})";

            using (var command = new SqliteCommand(sql, connection))
            {
                command.ExecuteNonQuery();

                if ( i % 10 == 9)
                {
                    transaction.Commit();
                 }

            }
        }
    }
}


5 commentaires

Veuillez éditer votre message pour inclure les spécificités du message d'erreur et du code qui provoque l'erreur. Pour les autres conseils, voir Comment demander .


Pourquoi pensez-vous que vous devez faire 10 à la fois?


Ajouter des exemples de code


C'est un devoir, c'est pourquoi j'ai besoin de 10 par 10. Je vais obtenir mon code juste demain, j'ai oublié mon poste de travail. :(


Sans votre code et sans votre erreur, nous ne pouvons pas vous aider. Si je me présente dans la boutique d'un mécanicien de voiture et dis "J'ai rencontré un problème tout en conduisant ma voiture. Je ne vais pas vous dire quel était le problème, et je n'ai pas ma voiture avec moi" alors pensez-vous qu'ils «Je vais être capable d'aider? Pourquoi pensez-vous que le développement logiciel est différent?


3 Réponses :


0
votes

En général, si vous souhaitez traiter n code> nombre d'éléments dans un ienumerable code>, vous pouvez utiliser une combinaison du ienumerable code > Méthodes d'extension, Ignorer CODE> et Prendre code> , où vous Ignorer itération * n code> éléments, puis prendre n code> items de la liste dans une boucle.

Notez que si nous incremporons notre variable de boucle par n code> sur chaque itération, cela devient la valeur que nous passons à saute code>. En outre, s'il y a moins de n code> éléments restants, prend (n) code> retournera tous les éléments restants. P>

Par exemple: P >

// items would be the list of results from reading your csv file. Pseudocode:
List<SomeType> items = GetCSVItems(csvFilePath);

// Set this to the number of items we want to process in each batch
int batchCount = 10;

// To process a batch of 'batchCount' number of items, we first Skip(iteration * batchCount) 
// items in our list, and then we Take(batchCount) items from the list for our next batch
for (int i = 0; i < items.Count; i += batchCount)
{
    List<SomeType> itemBatch = items.Skip(i).Take(batchCount).ToList();

    // Process itemBatch here
}


0 commentaires

0
votes

Vous pouvez utiliser la méthode d'extension lot de la bibliothèque Morelinq : lots la séquence source dans les godets de taille. < / em>

Si vous ne voulez pas gâcher avec des bibliothèques externes, vous pouvez utiliser la méthode ci-dessous, qui est une version légère de lot . xxx

Exemple d'utilisation: xxx

sortie:

1, 2, 3, 4, 5
6, 7, 8, 9, 10
11, 12, 13, 14, 15
16, 17, 18, 19, 20
21, 22


0 commentaires

0
votes

Je suppose que cette question est maintenant obsolète, car les devoirs sont probablement déjà déjà passés.

Cependant, il est évident du code que la première fois que le transaction.commit (); est appelé, la transaction sera complétée. Mais il n'y a pas de nouvelle transaction débutée dans la boucle, la prochaine fois que transaction.commit (); est appelé une erreur se produira car il n'y aura plus de transaction active!

En outre, vous n'avez aucun code après la boucle pour gérer les rangées résiduelles qui n'étaient même pas divisibles de 10. Même si le code de boucle d'origine avait travaillé, il aurait pu laisser des rangées non engagées qui n'auraient pas été correctement engagées. < / p>


0 commentaires