2014-10-29 114 views
0

我不知道为什么数据没有进入SQL。有人可以检查一下,看看我的代码有什么问题吗?我最下面的代码从和MSDN页:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx使用SqlBulkCopy插入到SQL

Dim connectionString As String = "Server= "<servername>"; integrated security=true" 

    Using sourceConnection As SqlConnection = _ 

     New SqlConnection(connectionString) 
     sourceConnection.Open() 

     Dim commandSourceData As SqlCommand = New SqlCommand(<TSQL>), sourceConnection) 
     Dim reader As SqlDataReader = commandSourceData.ExecuteReader 

     Using destinationConnection As SqlConnection = _ 
      New SqlConnection(connectionString) 
      destinationConnection.Open() 

      Using bulkcopy As SqlBulkCopy = _ 
       New SqlBulkCopy(destinationConnection) 
       bulkcopy.DestinationTableName = _ 
        "<tableName>" 

       Try 
        bulkcopy.WriteToServer(reader) 
       Catch ex As Exception 
        Console.WriteLine(ex.Message) 
       Finally 
        reader.Close() 
       End Try 

      End Using 
     End Using 
     sourceConnection.Close() 
    End Using 
+1

是否有错误讯息?源查询是否导致任何记录?这应该不重要,但为了以防万一在bulkcopy.WriteToServer(reader)之前添加'bulkcopy.BatchSize = 500'和'bulkcopy.BulkCopyTimeout = 2400'。批量优化运行,但在这种情况下应该不会有太大影响,您可以使用值来查看哪个编号最适合您。如果您遇到超时情况,'bulkCopy.BulkCopyTimeout'实际上可能会有所帮助。 – George 2014-10-29 18:34:19

+0

您是批量复制到新表还是已经存在的表?如果有新表,它确实存在吗?如果不存在,我不相信批量复制会创建一个表。如果已经存在,那么遵循Tim的建议。我不会在你的逻辑中看到任何特定的错误,你的代码实际上非常接近我的,并且在批量复制到临时表时我没有使用'ColumnMappings'。 PS:为了统治我们愚蠢而明显的东西,“”不是真正的目的地名称,是吗? – George 2014-10-29 19:19:53

+0

没有错误信息。我正在复制到我的数据库中的现有表。并且,不,ha,仅用于此发布。我正在阅读更多关于ColumnMappings的内容,但还没有多少运气。 – 2014-10-29 20:04:05

回答

3

在我做了BulkCopy系统,我设置的列映射为文档Column Mapping - SQL Bulk Copy

的映射成立解释与源和目标列名称。这个例子是从文档:

Dim mapID As New _ 
       SqlBulkCopyColumnMapping("ProductID", "ProdID") 
      bulkCopy.ColumnMappings.Add(mapID) 

当我第一次设置这个,我记得有麻烦,没有明确地设置我的环境中的列映射。

1

如果数据源的字段类型,字段顺序,字段计数与目标表不相同。您的批量复制将返回失败。

在上面的情况下,您应该将datasoruce中每个字段的ColumnMappings指定给sqlbulkcopy对象。

  SqlBulkCopy copy = new SqlBulkCopy(MySqlConn); 
      copy.BulkCopyTimeout = 6000; 
      copy.DestinationTableName = TableName; 
      for (int i = 0; i < this.lstBulkFields.Count; i++) { 
       // if the source fields name are the same with the targets. 
       copy.ColumnMappings.Add(this.lstBulkFields[i], this.lstBulkFields[i]); 
      } 
      copy.BatchSize = BatchSize; 
      copy.WriteToServer(MyDataSource);