INSERT object ou UPDATE s'il existe déjà à l'aide de BulkCopy (C #, SQL)

c# sqlbulkcopy sql-server

Question

J'essaie de mettre à jour une table avec une List<T> . J'ai créé une classe EnumExtension et une méthode qui convertit mon Enumerable en DataTable:

public static DataTable AsDataTable<T>(this IEnumerable<T> data)...

Et puis j'ai commencé à créer une méthode qui devrait utiliser BulkCopy pour insérer ou mettre à jour ma table, en utilisant l'énumérable. En ce moment, c'est écrit comme ça:

public void BulkInsertOrUpdate(DatabaseEnum database, IEnumerable<Object> enumerable, string TableName)
    {
        var connection = this.GetSqlConnection(database);

        var transaction = connection.BeginTransaction();

        using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
        {
            bulkCopy.BatchSize = 100;
            bulkCopy.DestinationTableName = TableName;
            try
            {
                bulkCopy.WriteToServer(enumerable.AsDataTable());
            }
            catch (Exception)
            {
                transaction.Rollback();
                connection.Close();
            }
        }
        transaction.Commit();
    }

(OBS: la méthode GetSqlConnection crée et ouvre ma connexion à l'aide de la chaîne de connexion appropriée.)

Mais je ne sais pas comment créer la fonctionnalité de mise à jour. Y a-t-il un moyen simple de le faire, avec un code efficace? J'aime bien BulkCopy, mais je peux essayer une autre méthode, en espérant ne pas nuire à mon architecture (et, finalement, je devrai faire ce sacrifice si je ne trouve pas le moyen).

Merci de votre attention, je suis prêt à répondre aux doutes sur ma situation.

Réponse acceptée

J'ai donc résolu mon problème (merci #JD). J'utilise essentiellement une table temporaire et y insère les données. D'abord je le tronque chaque fois qu'il est utilisé:

connection.Query(database_name, sql_truncate_query);

Ensuite, j'insère les données en utilisant la méthode que j'ai créée précédemment:

connection.BulkInsert(database_name, ienumerable, table_name);

OBS: Modification du nom de la méthode de BulkInsertOrUpdate à BulkInsert.

Plus tard, je mets à jour ma table de journaux à l’aide d’une simple requête MERGE SQL:

INSERT [database].[table]  (col1, col2)
SELECT col1, col2
FROM [database].[table2] t2 
WHERE NOT EXISTS (SELECT col1 FROM [database].[table] t1 WHERE t1.col1= t2.col1);

OBS: Mon problème a changé pendant mon développement, je n'utilise plus la fonctionnalité 'update', il me suffit de vérifier l'existence de la ligne. Bien sûr, vous pouvez écrire un code dans lequel il met à jour la valeur si elle est interceptée par la clause WHERE.

Je ne sais pas si c'est le moyen optimal de résoudre ce problème, mais c'est certainement mieux que d'insérer ou de mettre à jour chaque ligne à la fois.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi