Maison >développement back-end >C++ >Comment puis-je réaliser des insertions groupées rapides dans une base de données Access à l'aide de .NET/C# ?

Comment puis-je réaliser des insertions groupées rapides dans une base de données Access à l'aide de .NET/C# ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-03 22:02:40763parcourir

How Can I Achieve Fast Bulk Inserts into an Access Database Using .NET/C#?

Écriture d'un grand nombre d'enregistrements (insertion groupée) pour accéder dans .NET/C#

Problème : Insertion d'un un grand ensemble de données dans une base de données Access à l'aide d'ADO.NET est prend du temps.

Solution :

L'utilisation de DAO offre des avantages de vitesse significatifs par rapport à ADO.NET pour les insertions groupées dans Access :

1 . DAO utilisant des variables de champ (2,8 secondes) :

DAO.Field[] myFields = new DAO.Field[20];
for (int k = 0; k < 20; k++) myFields[k] = rs.Fields["Field" + (k + 1).ToString()];

for (int i = 0; i < 100000; i++)
{
    rs.AddNew();
    for (int k = 0; k < 20; k++)
    {
        myFields[k].Value = i + k;
    }
    rs.Update();
}

2. DAO utilisant l'index de colonne (11,0 secondes) :

for (int i = 0; i < 100000; i++)
{
    rs.AddNew();
    for (int k = 0; k < 20; k++)
    {
        rs.Fields[k].Value = i + k;
    }
    rs.Update();
}

3. DAO utilisant le nom de la colonne (17,0 secondes) :

for (int i = 0; i < 100000; i++)
{
    rs.AddNew();
    for (int k = 0; k < 20; k++)
    {
        rs.Fields["Field" + (k + 1).ToString()].Value = i + k;
    }
    rs.Update();
}

4. ADO.NET utilisant les instructions INSERT (79,0 secondes) :

for (int i = 0; i < 100000; i++)
{
    StringBuilder insertSQL = new StringBuilder("INSERT INTO TEMP (")
        .Append(names)
        .Append(") VALUES (");

    for (int k = 0; k < 19; k++)
    {
        insertSQL.Append(i + k).Append(",");
    }
    insertSQL.Append(i + 19).Append(")");
    cmd.CommandText = insertSQL.ToString();
    cmd.ExecuteNonQuery();
}

5. ADO.NET utilisant DataTable et DataAdapter (86,0 secondes) :

for (int i = 0; i < 100000; i++)
{
    DataRow dr = dt.NewRow();
    for (int k = 0; k < 20; k++)
    {
        dr["Field" + (k + 1).ToString()] = i + k;
    }
    dt.Rows.Add(dr);
}
da.Update(dt);

6. Fichier texte avec importation d'automatisation (2,8 secondes) :

Exportez les données vers un fichier texte et utilisez Access Automation pour les importer (non recommandé pour les grands ensembles de données) :

StreamWriter sw = new StreamWriter(Properties.Settings.Default.TEMPPathLocation);

for (int i = 0; i < 100000; i++)
{
    for (int k = 0; k < 19; k++)
    {
        sw.Write(i + k);
        sw.Write(",");
    }
    sw.WriteLine(i + 19);
}
sw.Close();

ACCESS.Application accApplication = new ACCESS.Application();
accApplication.OpenCurrentDatabase(databaseName, false, "");
accApplication.DoCmd.RunSQL("DELETE FROM TEMP");
accApplication.DoCmd.TransferText(TransferType: ACCESS.AcTextTransferType.acImportDelim,
    TableName: "TEMP",
    FileName: Properties.Settings.Default.TEMPPathLocation,
    HasFieldNames: true);
accApplication.CloseCurrentDatabase();
accApplication.Quit();
accApplication = null;

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn