Insertion de données en boucle à l'aide de sql bulkcopy classe c #

c# sqlbulkcopy

Question

J'ai deux bases de données maintenant je dois insérer des données d'un DB à un autre DB en boucle. Je sais peu de copie en bloc SQL et je ne sais pas comment insérer une donnée à la fois en utilisant la copie en bloc SQL.

voici la structure de ma table

CREATE TABLE [CandidateApplication](
 [EmailID] [varchar](300) NOT NULL,
 [Name] [varchar](300) NULL,
 [FileName] [varchar](500) NULL,
 [IsDownloaded] [bit] NOT NULL
)

En gros, j'ai besoin de récupérer les données d'une base de données avec une clause telle que IsDownloaded=0 , puis il IsDownloaded=0 faut itérer dans la boucle. avec en boucle, je vais obtenir le chemin du fichier à partir du champ FileName et télécharger ce fichier. si le téléchargement du fichier a réussi, je dois enregistrer ces données de db1 à db2 et mettre à jour le champ IsDownloaded=1 à db1.

puis-je gérer l'insertion de données d'une base de données à une autre base de données avec en boucle à l'aide de la classe de copie sqlbulk. veuillez suggérer. Merci

Réponse acceptée

vous n'avez pas besoin de parcourir les données en les insérant une par une; il vous suffit de passer une collection à la méthode WriteToServer ()

un exemple est:

HashSet<SomeObject> dataLines = new HashSet<SomeObject>(); 

foreach (var entity in someCollection)
        {
            if(entity == somecondition)
            {
                  dataLines.Add(new SomeObject
                              {
                                  CollectionItem1 = entity.Property1,
                                  CollectionItem2 = entity.Property2,
                                  CollectionItem3 = entity.Property3,
                                  CollectionItem4 = entity.Property4,
                                  CollectionItem5 = entity.Property5,
                                  CollectionItem6 = entity.Property6,
                                  CollectionItem7 = entity.Property7,
                              });
            }
        }
        try
        {
            _context.Connection.Open();
            EntityConnection connection = _context.Connection as EntityConnection;
            SqlConnection sqlConnection = null;
            if (connection != null)
            {
                sqlConnection = connection.StoreConnection as SqlConnection;
            }

            if (sqlConnection != null)
            {

                SqlBulkCopy bulkInsert = new SqlBulkCopy(sqlConnection);
                bulkInsert.DestinationTableName = "SomeTable";
                bulkInsert.ColumnMappings.Add("CollectionItem1", "Column1");
                bulkInsert.ColumnMappings.Add("CollectionItem2", "Column2");
                bulkInsert.ColumnMappings.Add("CollectionItem3", "Column3");
                bulkInsert.ColumnMappings.Add("CollectionItem4", "Column4");
                bulkInsert.ColumnMappings.Add("CollectionItem5", "Column5");
                bulkInsert.ColumnMappings.Add("CollectionItem6", "Column6");
                bulkInsert.ColumnMappings.Add("CollectionItem7", "Column7");
// dataLines is a collection of objects
                bulkInsert.WriteToServer(dataLines.AsDataReader());
                _context.SaveChanges();
            }
        }
        finally
        {
            _context.Connection.Close();
        }

Réponse populaire

C'est simple mec :) Désolé mon code dans VB.net J'espère que cela ne vous dérange pas

Remarque: L'important est le type de données dans votre table de données et de destination. Ils devraient être les mêmes

  1. Récupérez les données de db1 et faites ce que vous voulez et préparez les données dans datatable
  2. Utilisez cette fonction pour vider vos données dans la 2e base de données

Code:

  Public Shared Function BulkSave(ByVal dt As DataTable) As Boolean
    Dim mydb As New CSdatabase
    Try

    Dim connectionString = "Connection String"
    '' so there is no need to map columns. 
        Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(connectionString)
            bulkCopy.BatchSize = 25000
            bulkCopy.BulkCopyTimeout = 300

            bulkCopy.ColumnMappings.Add("EmailID", "EmailID")
            bulkCopy.ColumnMappings.Add("Name", "Name")
            bulkCopy.ColumnMappings.Add("FileName", "FileName")
            bulkCopy.ColumnMappings.Add("IsDownloaded", "IsDownloaded")
            bulkCopy.DestinationTableName = "dbo.CandidateApplication"

            bulkCopy.WriteToServer(dt)
        End Using
    Catch ex As Exception
        Throw ex
    Finally
        'mydb.closeConnection() ' Close your conneciton here
    End Try

    Return True

End Function


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