提问人:WindSwept 提问时间:5/4/2023 最后编辑:WindSwept 更新时间:5/4/2023 访问量:66
无法将参数值从 PSObject 转换为 Byte[] (PowerShell)
Failed to convert parameter value from a PSObject to a Byte[] (PowerShell)
问:
我正在尝试使用 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
答:
2赞
mklement0
5/4/2023
#1
它可能无法解决您的所有问题,但让我解决一个显而易见的问题:
- 您正在读取文件,因此将它们通过管道传递给
ConvertTo-Json
是没有意义的;也许你的意思是ConvertFrom-Json
[更新:你已经在你的问题中改了],即也许你的意图是将 JSON 文本解析为对象图 - 这是能够访问属性和*.json
ConvertFrom-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 字符串。
$jsonText
JsonContent
- 请注意,使用您自己的代码,一旦更改为 ,您将分配一个 a.k.a 实例(JSON 被解析为的对象图),这将解释症状。
ConvertFrom-Json
[pscustomobject]
[psobject]
- 请注意,使用您自己的代码,一旦更改为 ,您将分配一个 a.k.a 实例(JSON 被解析为的对象图),这将解释症状。
顺便说一句,您对参数的使用:
-Depth
- 读取 JSON 时通常不需要 JSON(除非您的 JSON 具有超过 1024(!) 个嵌套级别)。
-Depth
ConvertFrom-Json
- 但是,在编写 JSON() 时很重要,因为不幸的是,默认深度为 2。有关详细信息,请参阅此答案。
-Depth
ConvertTo-Json
- 读取 JSON 时通常不需要 JSON(除非您的 JSON 具有超过 1024(!) 个嵌套级别)。
评论