C# 使用sql bulkcopy类c在循环中插入数据#

C# 使用sql bulkcopy类c在循环中插入数据#,c#,sqlbulkcopy,C#,Sqlbulkcopy,我有两个数据库,现在我必须在循环中将数据从一个数据库插入到另一个数据库。我知道位sql批量复制,但我不知道如何使用sql批量复制一次插入一个数据 这是我的桌子结构 CREATE TABLE [CandidateApplication]( [EmailID] [varchar](300) NOT NULL, [Name] [varchar](300) NULL, [FileName] [varchar](500) NULL, [IsDownloaded] [bit] NOT NULL )

我有两个数据库,现在我必须在循环中将数据从一个数据库插入到另一个数据库。我知道位sql批量复制,但我不知道如何使用sql批量复制一次插入一个数据

这是我的桌子结构

CREATE TABLE [CandidateApplication](
 [EmailID] [varchar](300) NOT NULL,
 [Name] [varchar](300) NULL,
 [FileName] [varchar](500) NULL,
 [IsDownloaded] [bit] NOT NULL
)
基本上,我需要用
isdownload=0
这样的子句从一个db中获取数据,然后我需要在循环中迭代。使用in-loop,我将从
FileName
字段获取文件路径并下载该文件。如果文件下载成功,那么我必须将数据从db1保存到db2,并将字段
isdownload=1
更新到db1

我可以使用sqlbulk copy类在循环中处理从一个db到另一个db的数据插入吗。请建议。谢谢,很简单,伙计:)对不起,我在VB.net中的代码,希望你不要介意

注意:重要的是数据表和目标表中的数据类型。它们应该是相同的

  • 从db1中获取数据,做任何您想做的事情,并准备好datatable中的数据
  • 使用此功能将数据转储到第二个数据库中
  • 代码:


    您不需要逐个插入数据,只需将集合传递给WriteToServer()方法

    例如:

    HashSet dataLines=newhashset();
    foreach(someCollection中的var实体)
    {
    if(entity==somecondition)
    {
    添加(新的SomeObject)
    {
    CollectionItem1=entity.Property1,
    CollectionItem2=entity.Property2,
    CollectionItem3=entity.Property3,
    CollectionItem4=entity.Property4,
    CollectionItem5=entity.Property5,
    CollectionItem6=entity.Property6,
    CollectionItem7=entity.Property7,
    });
    }
    }
    尝试
    {
    _context.Connection.Open();
    EntityConnection连接=_context.connection作为EntityConnection;
    SqlConnection-SqlConnection=null;
    if(连接!=null)
    {
    sqlConnection=connection.StoreConnection作为sqlConnection;
    }
    if(sqlConnection!=null)
    {
    SqlBulkCopy bulkInsert=新的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”);
    //数据线是对象的集合
    bulkInsert.WriteToServer(dataLines.AsDataReader());
    _SaveChanges();
    }
    }
    最后
    {
    _context.Connection.Close();
    }
    
    batchsize是300秒内25000行。我知道如何使用SqlBulkCopy类。我的问题是不同的,当我要使用SqlBulkCopy时,我可以更新循环中的数据吗?意味着一次更新一行?如果您想一次更新一行,那么您不需要SqlBulkCopy。SqlBulkCopy在这种情况下速度较慢。我需要知道在循环中使用SqlBulkCopy逐个更新数据是否可行……如果是,那么您可以用代码示例指导我。感谢使用循环更新是不可行的,批量更新意味着您拥有大量数据,并且希望在DB和本语句中进行更新。我不明白你为什么需要循环?你能给我一点完整的代码吗。给我数据线的代码。在这种情况下,thanksdatalines只是一个HashSet。在插入数据库之前,如何将数据分配给数据线?我已经为您修改了上面的内容,我们不能用List代替HashSet吗?如果没有,请告诉我原因。
      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
    
    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();
            }