【问题标题】:Inserting image into SQL Server column of type VARBINARY(MAX) using Powershell使用 Powershell 将图像插入 VARBINARY(MAX) 类型的 SQL Server 列
【发布时间】:2018-10-26 01:48:40
【问题描述】:

我被困住了。我正在尝试将一张图片从我的硬盘驱动器插入到VARBINARY(MAX) 类型的 SQL Server 列中。我把它转换成东西,但我什至不确定它是什么。结果看起来像“81 69 20 0 81 69 20 0 81 69 20 0 81 69 20 0 81 69 20 0 81 69 20 0 81”,但要长得多。在我的更新命令中,如果我将 $file 替换为 01234 更新没有任何问题,所以我几乎可以肯定将它转换为适当的格式是一个问题。

$i = 1
$shape|foreach{
if ($shape.Item($i).name.Substring(0, 7) -eq 'Picture')
    {
        #write-host $shape.Item($i).name
        $shape.Item($i).copy()

        #write-host $firstChart.name
        $firstChart.paste()
        $firstChart.Export("c:\temp\pictures\image1.jpg", "JPG")
        #$firstChart.Delete

        [Byte[]]$file = get-content -Encoding Byte C:\TEMP\pictures\image1.jpg

        #$file = [convert]::ToBase64String((get-content C:\TEMP\pictures\image1.jpg -encoding byte))

        $cmd.CommandText ="UPDATE QuoteData SET PII_Image1 = $file Where QuoteNumber =  '"+$WorkSheet.Range('G7').Text.replace("'","''")+"'"
        $cmd.ExecuteNonQuery()
    }
    $i++
}

【问题讨论】:

  • VARBINARY 存储二进制字节。为什么将其编码为 base64 字符串?正确的编码应该是十六进制的,比如 0x234fd12349767b 之类的
  • 那只是一个测试。我把它注释掉了。你列出的格式就是我要找的。​​span>
  • 这有十六进制格式的我,但我似乎无法用替换(“”,“”)摆脱空格。 $file = gc -encoding byte "c:\temp\pictures\image1.jpg" |% {("{0:x}" -f $_)};
  • 你能发布$file的值吗?或者至少前十几个字符?
  • 当然是“ff d8 ff e0 0 10 4a 46 49 46 0 1 1 1 0 c0”。我的想法是,如果我可以把空格去掉并在前面添加 0x,它可能会占用它。

标签: sql-server powershell


【解决方案1】:

您的字节数组需要转换为十六进制表示。请注意添加了 $hexString 行并且更改了 $cmd.CommandText。

    [Byte[]]$file = get-content -Encoding Byte C:\TEMP\pictures\image1.jpg
    $hexString = ($file|ForEach-Object ToString X2) -join ''
    $hexString = '0x'+$hexString 

    $cmd.CommandText ="UPDATE QuoteData SET PII_Image1 = $hexString Where QuoteNumber =  '"+$WorkSheet.Range('G7').Text.replace("'","''")+"'"

【讨论】:

  • 谢谢。这是一个巨大的飞跃。它抱怨“以开头的标识符太长。最大长度为 128。”我现在正在做的事情。
  • 好的,我发现了标识符问题。在将其放入 SQL 语句之前,我必须将 0x 添加到 hexString。现在效果很好!
  • 我不想承认我花了多少时间来解决这个问题,所以谢谢你:)。你也知道为什么在 sql 命令中添加 0x 会使其认为 $hexString 是列名吗?
  • @Zach 很可能是格式错误的 sql。可能是引号内的撇号
猜你喜欢
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2010-11-15
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多