Вставка данных в цикл с использованием класса sql bulkcopy С#

у меня есть две базы данных, теперь мне нужно вставить данные из одной базы данных в другую базу данных в цикле. Я знаю массовую копию SQL, и я не знаю, как вставлять данные по одному за раз, используя массовую копию SQL.

вот моя структура таблицы

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

в основном мне нужно получить данные из одной базы данных с таким предложением, как IsDownloaded=0, а затем мне нужно выполнить итерацию в цикле. в цикле я получу путь к файлу из поля FileName и загружу этот файл. если файл загружается успешно, мне нужно сохранить эти данные из db1 в db2 и обновить поле IsDownloaded=1 в db1.

Могу ли я обрабатывать вставку данных из одной базы данных в другую с помощью цикла с использованием класса копирования sqlbulk. пожалуйста, предложите. спасибо


person Thomas    schedule 28.02.2013    source источник


Ответы (2)


вам не нужно будет повторять вставку данных один за другим, все, что вам нужно сделать, это передать коллекцию в метод WriteToServer().

пример:

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();
        }
person AdamWhite    schedule 28.02.2013
comment
Можете ли вы дать мне полный код. дайте мне код для dataLines. спасибо - person Thomas; 28.02.2013
comment
линии данных в данном случае — это просто Hashset‹T› - person AdamWhite; 28.02.2013
comment
как вы назначаете данные в dataLines перед вставкой в ​​db? - person Thomas; 28.02.2013
comment
Я изменил выше для вас - person AdamWhite; 28.02.2013
comment
мы не можем использовать List вместо HashSet? если нет, пожалуйста, скажите мне причину. - person Thomas; 01.03.2013
comment
Конечно, вы можете использовать список, я использовал хэш-набор, поскольку я переопределил элементы равенства, чтобы я мог гарантировать, что каждый элемент в этой коллекции был уникальным на основе множества факторов, которые применялись при добавлении элемента в коллекцию, а не делать отчетливо позже - person AdamWhite; 01.03.2013

Это просто, чувак :) Извини, мой код в VB.net, надеюсь, ты не против.

Примечание. Важным моментом является тип данных в вашей таблице данных и целевой таблице. Они должны быть одинаковыми

  1. Извлеките данные из db1 и сделайте все, что хотите, и подготовьте данные в таблице данных.
  2. Используйте эту функцию для сброса ваших данных во вторую базу данных.

Код:

  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
person Abdul Saboor    schedule 28.02.2013
comment
размер пакета составляет 25000 строк за 300 секунд. - person Abdul Saboor; 28.02.2013
comment
я знаю, как использовать класс SqlBulkCopy. мой вопрос был другим: когда я буду использовать SqlBulkCopy, могу ли я обновлять данные в цикле по одному? - person Thomas; 28.02.2013
comment
Если вы хотите обновлять по одной строке за раз, вам не нужен sqlbulkCopy. SqlBulkCopy в этом случае работает медленнее. - person Abdul Saboor; 28.02.2013
comment
мне нужно знать, возможно ли обновлять данные с помощью SqlBulkCopy в цикле один за другим... если да, то можете ли вы помочь мне с примером кода. спасибо - person Thomas; 01.03.2013
comment
нет Невозможно обновлять с помощью цикла. Массовое обновление означает, что у вас много данных, и вы хотите обновить их в БД и в этом операторе. Я не понимаю, зачем тебе цикл? - person Abdul Saboor; 04.03.2013