Вмъкване на данни в цикъл с помощта на sql bulkcopy class c#

имам две бази данни, сега трябва да вмъкна данни от една db в друга db в цикъл. знам малко sql групово копие и не знам как да вмъквам по една информация с помощта на sql групово копие.

ето структурата на моята таблица

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

основно трябва да извлека данни от една db с клауза като IsDownloaded=0 и след това трябва да повторя в цикъл. с in loop ще получа пътя на файла от полето FileName и ще изтегля този файл. ако файлът се изтегли успешно, тогава трябва да запазя тези данни от db1 в db2 и да актуализирам полето IsDownloaded=1 в db1.

мога ли да обработвам вмъкването на данни от една db в друга db с in loop, използвайки sqlbulk copy class. моля предложете. Благодаря


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
datalines в този случай е просто 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 и направете каквото искате и подгответе данните в datatable
  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
размерът на пакета е 25 000 реда за 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
не Не е възможно да се актуализира с цикъл, груповата актуализация означава, че имате много данни и искате да актуализирате в DB и в това изявление. Не разбирам защо ви трябва цикъл? - person Abdul Saboor; 04.03.2013