我們在PowerShell中有一個有效的解決方案,可將Web 服務 (WS) 資料流式傳輸到SQL Server 2019表中,其中有一列資料型別為 NVARCHAR(max)。這個WS資料就是Json格式的業務資料。我想增強此解決方案,使其也能夠將 WS 資料流式傳輸到 VARBINARY(max) 列中。
當前作業的代碼如下所示(縮寫):
$SQL_ImpInsert = @"
Insert Into [Database].dbo.ImportTable (SeqNo, BulkDataNVarChar)
Values (@SeqNo, @WSData)
"@
# Create the SQL objects.
$SQLConn = New-Object System.Data.SqlClient.SqlConnection $ConnStr
$SQLConn.Open()
$SQLCommand = $SQLConn.CreateCommand()
$SQLCommand.CommandText = $SQL_ImpInsert
# Prep the stream
$WS_URL = 'https://a_valid_ws_request'
$WebRequest = [System.Net.WebRequest]::Create($WS_URL)
$WebRequest.ClientCertificates.Add($WS_Cert) | Out-Null
$WebRequest.Method = "Get"
$WebResponse = $WebRequest.GetResponse()
$WebStream = $WebResponse.GetResponseStream()
$WebStreamRdr = New-Object System.IO.StreamReader $WebStream
# Prep the SQL command to use the stream
$SeqNo = 1
$SQLCommand.Parameters.Clear()
$SQLCommand.Parameters.Add("@SeqNo", [Data.SQLDBType]::INT, -1).Value = $SeqNo
$SQLCommand.Parameters.Add("@WSData", [Data.SQLDBType]::NVARCHAR, -1).Value = $WebStreamRdr
# Perform the streamed insert from the WS into the SQL table
$ExecOutput = $SQLCommand.ExecuteNonQuery();
為了嘗試增強解決方案,我在表中添加了一個 VARBINARY 列,并將命令引數資料型別更改為 VARBINARY,如下所示(僅更改顯示的上述代碼):
$SQL_ImpInsert = @"
Insert Into [Database].dbo.ImportTable (SeqNo, BulkDataBlob)
Values (@SeqNo, @WSData)
"@
$SQLCommand.Parameters.Add("@WSData", [Data.SQLDBType]::VARBINARY, -1).Value = $WebStreamRdr
當我運行新版本的 PowerShell 腳本時,在 ExecuteNonQuery 陳述句期間出現以下錯誤:
使用“0”引數呼叫“ExecuteNonQuery”的例外:“無法將引數值從 StreamReader 轉換為 Byte[]。”
我查看了命令引數。添加引數以查看是否需要在那里進行調整。Add 方法有一些變化,但我不知道\認為它們是相關的。
我對流媒體呼叫了解得不夠多,不知道那里是否有任何需要調整的地方。由于我只更改目標 SQL 列資料型別,我希望流的設定保持不變。
我檢查了 WS 資料,不應該有任何資料大于 SQL 資料型別 VARBINARY 可以處理的資料。我認為該錯誤與傳入的資料大小無關。
關于如何調整此代碼以將 WS 資料流式傳輸到 VARBINARY 引數以及 SQL 列的任何想法?
uj5u.com熱心網友回復:
StreamReader實作了一個 TextReader,它為您提供了一個無法轉換為varbinary位元組陣列的字串。我猜您的第一個示例使用nvarchar成功,因為您獲得了字串的隱式轉換。
您可以將其重構為根本不使用StreamReader,但要回答您需要將該字串轉換為位元組陣列的問題:
$output = $WebStreamRdr.ReadToEnd() # todo: flush & close
$bytes = [system.Text.Encoding]::UTF8.GetBytes($output)
然后使用 $bytes:
$SQLCommand.Parameters.Add("@WSData", [Data.SQLDBType]::VARBINARY, -1).Value = $bytes
您也可以像以前一樣讓字串傳遞到命令中:
$SQLCommand.Parameters.Add("@WSData", [Data.SQLDBType]::NVARCHAR, -1).Value = $WebStreamRdr
然后讓命令將其轉換為varbinary:
$SQL_ImpInsert = @"
Insert Into [Database].dbo.ImportTable (SeqNo, BulkDataBlob)
Values (@SeqNo, cast(@WSData as varbinary(max)))
"@
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/521958.html
