简体   繁体   English

Powershell - 如何在事务块中添加批量复制命令

[英]Powershell - How to add Bulk Copy command in Transaction block

I am using PowerShell version 5, I want to Add the BulkCopy command in the Transaction block, so that if at all there are any issues while copying data from 1 server to another, then nothing should be committed.我正在使用 PowerShell 版本 5,我想在 Transaction 块中添加 BulkCopy 命令,这样如果在将数据从一台服务器复制到另一台服务器时存在任何问题,则不应提交任何内容。

Below is my code, where Transaction works for other multiple SQL Commands (Create, Insert) so if anything fails while inserting table is also not created.下面是我的代码,其中事务适用于其他多个 SQL 命令(创建、插入),因此如果在插入表时出现任何故障,也不会创建。 But same is not working for the BulkCopy command.但同样不适用于 BulkCopy 命令。

Script脚本

$SrcconnString = "Data Source=<Server-Name>;Database=<DB-Name>;User ID=<Login>;Password=<Pass>"
$TrgconnString = "Data Source=<Server-Name>;Database=<DB-Name>;User ID=<Login>;Password=<Pass>"

$error.clear()



$TrgTblName = 'dbo.test'
$BulkCopyTimeout = '1000'
$BulkCopyBatchSize = '20000'

Import-Module -Name SQLServer
write-host 'module loaded'

 #Create a SQL connection object
 
$Srcconn = New-Object System.Data.SqlClient.SqlConnection $SrcconnString
$Trgconn = New-Object System.Data.SqlClient.SqlConnection $TrgconnString


 #Attempt to open the connection
    $Srcconn.Open()
    $Trgconn.Open()
    
$tran = $Trgconn.BeginTransaction()
    
 try
{   
    
    if($Srcconn.State -eq "Open" -And $Trgconn.State -eq "Open" )
{
       Write-Host "connection successful"

  <# Below Commented block works for Transaction  #>
      
     <#
    $script = @"
            DROP Table IF EXISTS dbo.test_bulk;
            Create table dbo.test_bulk (Id int, Name varchar(2));
            INSERT INTO dbo.test_bulk(Id,name) Values (1,'vj'),(2,'jgjeguegjeg');
            
"@
     
      
       $cmd = New-Object System.Data.SqlClient.SqlCommand($script, $Trgconn)
        $cmd.Transaction = $tran
        [void]$cmd.ExecuteNonQuery()
      
      $tran.Commit()
    #> 

    
      

         $sql = "SELECT top 100 * FROM dbo.test(NOLOCK)";
        
           $sqlCommand = New-Object system.Data.SqlClient.SqlCommand($sql, $Srcconn)
          [System.Data.SqlClient.SqlDataReader] $sqlReader = $sqlCommand.ExecuteReader()                        
          $bulkCopy = New-Object Data.SqlClient.SqlBulkCopy($TrgconnString, [System.Data.SqlClient.SqlBulkCopyOptions]::KeepIdentity,$tran)
          $bulkCopy.DestinationTableName = $TrgTblName
          $bulkCopy.BulkCopyTimeOut = $BulkCopyTimeout
          $bulkCopy.BatchSize = $BulkCopyBatchSize
          $bulkCopy.WriteToServer($sqlReader)
         

          $tran.Commit()
          $sqlReader.Close()
         $bulkCopy.Close()



      
      }
       
    }  
      catch
      {
      $tran.Rollback()
        #Write-Host "Operation failed"
        #$error
       $_.exception.message
      }
    
    finally
    {
    $Srcconn.Close()
    $Trgconn.Close()
    $error.clear()
    }
 

Update: After @DanGuzman comment, I Specified the transaction object ($tran) as the third parameter for the SqlBulkCopy command,更新: @DanGuzman 评论后,我指定事务 object ($tran) 作为 SqlBulkCopy 命令的第三个参数,

 $bulkCopy = New-Object Data.SqlClient.SqlBulkCopy($TrgconnString, [System.Data.SqlClient.SqlBulkCopyOptions]::KeepIdentity,$tran)

but now it fails with an error但现在它失败并出现错误

Exception calling "WriteToServer" with "1" argument(s): "WriteToServer requires an open and available connection. The Connection's current state is closed."

Search for bcp utility and try to use it搜索 bcp 实用程序并尝试使用它

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM