代码之家  ›  专栏  ›  技术社区  ›  Thomas

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

  •  0
  • Thomas  · 技术社区  · 12 年前

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

    这是我的桌子结构

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

    基本上,我需要使用类似的子句从一个数据库中获取数据 IsDownloaded=0 然后我需要循环迭代。使用in循环,我将从中获取文件路径 FileName 字段并下载该文件。如果文件下载成功,那么我必须将数据从db1保存到db2并更新字段 IsDownloaded=1 到db1。

    我可以使用sqlbulk-copy类在循环中处理从一个数据库到另一个数据库的数据插入吗。请提出建议。谢谢

    2 回复  |  直到 12 年前
        1
  •  1
  •   marc_s    12 年前

    很简单,伙计:)对不起,我在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
    
        2
  •  0
  •   AdamWhite    12 年前

    您不需要逐个迭代插入的数据,只需要将集合传递到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();
            }