无法将参数值从 PSObject 转换为 Byte[] (PowerShell)

Failed to convert parameter value from a PSObject to a Byte[] (PowerShell)

提问人:WindSwept 提问时间:5/4/2023 最后编辑:WindSwept 更新时间:5/4/2023 访问量:66

问:

我正在尝试使用 powershell 将一些数据插入到 azure sql 数据库中。我是powershell初学者。我插入的数据来自 json 文件。

我尝试插入的数据是: (1)json 的 Property1,它是一个字符串。 (2)json 的 Property2,它是一个字符串。 (3)将JSON文件的全部内容作为字符串。

但是我收到此错误:

使用“0”参数调用“ExecuteNonQuery”时出现异常:“无法将参数值从 PSObject 转换为 Byte[]。

如果我尝试使用:$Command.Parameters[“@JsonContent”]。Value = $jsonContent.ToString() - 然后我得到一个空/空白字符串插入到表中

这是我的代码:请你能帮我看看问题吗

$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = "Server=$server;Database=$database;User 
ID=$username;Password=$password;Trusted_Connection=False;"

if($Connection.State -eq 'Closed')
{
  $Connection.Open()
}
else 
{
  $Connection.Open()
}


$insertStatement = "INSERT INTO $table (P1, P2, JsonContent) 
VALUES (@P1, @P2, @JsonContent)"


$Command = New-Object System.Data.SqlClient.SqlCommand($insertStatement, $Connection)
$Command.Parameters.Add("@P1", [System.Data.SqlDbType]::VarChar, 250)
$Command.Parameters.Add("@P2", [System.Data.SqlDbType]::VarChar, 250)
$Command.Parameters.Add("@JsonContent", [System.Data.SqlDbType]::NVarChar, -1)

Get-ChildItem -Path $jsonFilesPath -Filter *.json | ForEach-Object {
$jsonContent = Get-Content $_.FullName | ConvertFrom-Json -Depth 100

# Set the parameter values for the SQL insert statement
$Command.Parameters["@P1"].Value = $jsonContent.P1
$Command.Parameters["@P2"].Value = $jsonContent.P2
$Command.Parameters["@JsonContent"].Value = $jsonContent


# Execute SQL insert statement
$Command.CommandText = $insertStatement
$Command.ExecuteNonQuery()

# Output the filename to the pipeline log
Write-Host "Inserted $($_.FullName) into $table"
}


$Connection.Close()

我尝试插入的表定义为:

CREATE TABLE [dev].[TestTable]
(
[P1] [varchar](250) NOT NULL,
[P2] [varchar](250) NOT NULL,
[JsonContent] [nvarchar](max) NOT NULL,
[JsonHash]  AS (hashbytes('SHA2_256',[JsonContent])) PERSISTED,
CONSTRAINT [pkTestTable] PRIMARY KEY CLUSTERED 
(
[P1] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) 
ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
sql-server powershell

评论


答:

2赞 mklement0 5/4/2023 #1

它可能无法解决您的所有问题,但让我解决一个显而易见的问题:

  • 您正在读取文件,因此将它们通过管道传递给 ConvertTo-Json 是没有意义的;也许你的意思是 ConvertFrom-Json [更新:你已经在你的问题中改了],即也许你的意图是将 JSON 文本解析为对象图 - 这是能够访问属性和*.jsonConvertFrom-Json.P1.P2

所以也许这就是你的意思:

Get-ChildItem -Path $jsonFilesPath -Filter *.json | ForEach-Object {
  
  # Read the JSON text as a single, multi-line string
  $jsonText = $_ | Get-Content -Raw

  # Parse the JSON text into an object graph, so you can access properties.
  $objectGraphFromJson = $jsonText | ConvertFrom-Json
  
  # Set the parameter values for the SQL insert statement
  $Command.Parameters["@P1"].Value = $objectGraphFromJson.P1
  $Command.Parameters["@P2"].Value = $objectGraphFromJson.P2
  $Command.Parameters["@JsonContent"].Value = $jsonText
  
  # Execute SQL insert statement
  $Command.CommandText = $insertStatement
  $Command.ExecuteNonQuery()
  
  # Output the filename to the pipeline log
  Write-Host "Inserted $($_.FullName) into $table"
}

注意:

  • 它是 ,即分配给 SQL 参数的原始 JSON 字符串$jsonTextJsonContent

    • 请注意,使用您自己的代码,一旦更改为 ,您将分配一个 a.k.a 实例(JSON 被解析为的对象图),这将解释症状。ConvertFrom-Json[pscustomobject][psobject]
  • 顺便说一句,您对参数的使用:-Depth

    • 读取 JSON 时通常不需要 JSON(除非您的 JSON 具有超过 1024(!) 个嵌套级别)。-DepthConvertFrom-Json
    • 但是,在编写 JSON() 时很重要,因为不幸的是,默认深度为 2。有关详细信息,请参阅此答案-DepthConvertTo-Json