Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用Powershell将映像插入到类型为VARBINARY(MAX)的SQL Server列中_Sql Server_Powershell - Fatal编程技术网

Sql server 使用Powershell将映像插入到类型为VARBINARY(MAX)的SQL Server列中

Sql server 使用Powershell将映像插入到类型为VARBINARY(MAX)的SQL Server列中,sql-server,powershell,Sql Server,Powershell,我卡住了。我正在尝试将图片从硬盘插入类型为VARBINARY(MAX)的SQL Server列。我把它转换成某种东西,但我甚至不确定它是什么。结果看起来像“81692008169200816920081208169200816920081692008120081981”,但要长得多。在我的update命令中,如果我将$file替换为01234,则更新不会出现任何问题,因此我几乎可以肯定,这是一个将其转换为正确格式的问题 $i = 1 $shape|foreach{ if ($shape.Item

我卡住了。我正在尝试将图片从硬盘插入类型为
VARBINARY(MAX)
的SQL Server列。我把它转换成某种东西,但我甚至不确定它是什么。结果看起来像“81692008169200816920081208169200816920081692008120081981”,但要长得多。在我的update命令中,如果我将$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++
}

您的字节数组需要转换为十六进制表示形式。请注意,添加了$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("'","''")+"'"

您的字节数组需要转换为十六进制表示形式。请注意,添加了$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("'","''")+"'"

VARBINARY存储二进制字节。为什么要将其编码为base64字符串?正确的编码应该是十六进制的,比如0x234fd12349767b,或者只是一个测试。我把它注释掉了。您列出的格式就是我要找的格式。这是十六进制格式,但我似乎无法用replace(“,”)去掉空格$file=gc-编码字节“c:\temp\pictures\image1.jpg”|%{(“{0:x}”-f$)};你能公布$file的值吗?或者至少是前十几个字符?当然是“ff d8 ff e0 0 10 4a 46 49 0 1 1 0 c0”。我的想法是,如果我能把空格取出来,在前面加上0x,它可能需要。VARBINARY存储二进制字节。为什么要将其编码为base64字符串?正确的编码应该是十六进制的,比如0x234fd12349767b,或者只是一个测试。我把它注释掉了。您列出的格式就是我要找的格式。这是十六进制格式,但我似乎无法用replace(“,”)去掉空格$file=gc-编码字节“c:\temp\pictures\image1.jpg”|%{(“{0:x}”-f$)};你能公布$file的值吗?或者至少是前十几个字符?当然是“ff d8 ff e0 0 10 4a 46 49 0 1 1 0 c0”。我的想法是,如果我能把空格拿出来,在前面加上0x,它可能会占上风。谢谢。这是一个巨大的飞跃。它抱怨“以开头的标识符太长。最大长度为128。”我现在正在处理这个问题。好的,我解决了标识符问题。我必须先将0x添加到hexString中,然后再将其放入SQL语句中。现在效果很好!我不想承认我花了多少时间试图弄明白这一点,所以谢谢你:)。您还知道为什么在sql命令中添加0x会使它认为$hexString是一个列名吗?@Zach它很可能是格式错误的sql。可能是引用字符串中的撇号,谢谢。这是一个巨大的飞跃。它抱怨“以开头的标识符太长。最大长度为128。”我现在正在处理这个问题。好的,我解决了标识符问题。我必须先将0x添加到hexString中,然后再将其放入SQL语句中。现在效果很好!我不想承认我花了多少时间试图弄明白这一点,所以谢谢你:)。您还知道为什么在sql命令中添加0x会使它认为$hexString是一个列名吗?@Zach它很可能是格式错误的sql。可能是引用字符串中的撇号