簡體   English   中英

不從 ExecuteNonQuery 針對 MS SQL Server 從 PowerShell 腳本執行的插入中取回計數

[英]Not Getting Back a Count from an Insert Executed by ExecuteNonQuery Against MS SQL Server from PowerShell script

以下代碼執行成功的 BULK INSERT,但不返回受影響的行數。 當我執行 'SELECT count(*) ...' 以確認計數時,已插入數百萬行。 我懷疑溢出錯誤是問題的一部分。 為什么受影響的行數無法返回? 關於如何獲得計數的任何想法? 我還有其他幾個類似的例程,它們總是返回計數。

代碼

try {

     $Command = New-Object System.Data.SQLClient.SQLCommand
     $Command.Connection = "Persist Security Info=False;Integrated Security=true;Initial Catalog=$($file_info.database);server=$($file_info.db_server_instance)"
     $Command.CommandTimeout = 18000 # 5 hours
     $Command.Connection.Open()

     try {

          $bulkinsert_sql = "BULK INSERT $($file_info.database).$($file_info.owner).$($file_info.table) FROM '$load_file_path' with (ERRORFILE='$load_file_error_path', MAXERRORS=$($file_info.dbload_error_max), TABLOCK, FIELDTERMINATOR='\t')"
          $Command.CommandText = $bulkinsert_sql
          $loaded_cnt=$Command.ExecuteNonQuery()
          write-host "$loaded_cnt ROWS LOADED"

     } catch [System.Data.SqlClient.SqlException] {

          $_ | select -expandproperty invocationinfo | Format-List Line, PositionMessage -force
          write-host $_.Exception.ToString() -foregroundcolor "red"     
          $ErrorActionPreference = "Continue"
     }

     # set error preference back
     $ErrorActionPreference = "stop"

} catch [System.Data.SqlClient.SqlException] {

     $_ | select -expandproperty invocationinfo | Format-List Line, PositionMessage -force
     write-host $_.Exception.ToString() -foregroundcolor "red"
     $ErrorActionPreference = "stop"

} finally {

     if ($Command.Connection -eq 'Open') {
         $Command.Connection.Close()
     }
}

捕獲的錯誤消息

System.Data.SqlClient.SqlException (0x80131904): Bulk load data conversion error (truncation) for row 1714271, column 72 (PROVIDER_NAME1).
Bulk load data conversion error (truncation) for row 1714272, column 72 (PROVIDER_NAME1).
Bulk load data conversion error (truncation) for row 2083378, column 72 (PROVIDER_NAME1).
Bulk load data conversion error (overflow) for row 4633809, column 82 (TF_ME_TOT_DEDUCTIONS).
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, 
TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean&
 usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at CallSite.Target(Closure , CallSite , Object )
ClientConnectionId:ba9e07ac-1bc4-4c59-8a0a-167d7b281644
Error Number:4863,State:1,Class:16

為什么受影響的行數無法返回? 關於如何獲得計數的任何想法?

ExecuteNonQuery 不是運行查詢的“最低級別”方法。 它對 SQL Server 可能返回的信息做出了一些簡化的假設。

從客戶端運行查詢時,SQL Server 可以返回錯誤消息、行計數消息和結果集的任意組合。 但是為了簡化正常情況,SqlClient 在看到錯誤消息時會拋出 SqlException,因此 ExecuteNonQuery 甚至不會返回(更不用說返回行數了)。

如果您希望 ExecuteNonQuery 返回,您可以將所有錯誤消息重定向到事件處理程序,並使用SqlConnection.FireInfoMessageEventOnUserErrors抑制 .NET 異常拋出行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM