我需要带一个 Varbinary(max)
从 SQL Server 列并将其插入另一个 varbinary
列,但是我的图像在通过新字段显示时没有呈现,我做错了什么?
我从 SQL Server 复制过来的,即
E7D28201A240202178EF491E413EB4DDBCFB54A15077A989A37A0C5E4E0F143AEE7000CE3F3A70C0E4F342E524C8F4A7243888AA581EC051B030E7A8EF4E233DF.....
进而
update client
set Photo = convert(varbinary(max),'E7D28201A240202178EF491E413EB4DDBCFB54A15077A989A37A0C5E4E0F143AEE7000CE3F3A70C0E4F342E524C8F4A7243888AA581EC051B030E7A8EF4E233DF.....')
where id='40946b09-81be-42b0-ae62-63182acb1e89'
最佳答案
数据不是Base64 encoded因为这将具有更大范围的字母字符,而该值是纯十六进制值(即 0-9、A-F)。此外,由 O.P. 提供的示例 HTML 代码(在对问题的评论中)是:
<img src="data:image;base64,@System.Convert.ToBase64String(Model.PhotoDisplay)
这表明
Model.PhotoDisplay
的源值首先转换为 Base64 以便 data:image;base64
类型指定将是正确的。问题是 SQL Server 在被要求转换值时,并不知道它已经是一个十六进制/二进制字符串。您需要告诉 SQL Server 源数据的格式是什么。这可以通过两种方式完成:
0x
前缀并删除单引号:UPDATE cl
SET cl.Photo = CONVERT(VARBINARY(MAX), 0xE7D28201A24020.....)
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
0x
前缀并使用 1
的“样式” :UPDATE cl
SET cl.Photo = CONVERT(VARBINARY(MAX), '0xE7D28201A24020.....', 1)
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
0x
的值前缀并使用 2
的“样式” :UPDATE cl
SET cl.Photo = CONVERT(VARBINARY(MAX), 'E7D28201A24020.....', 2)
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
但是,如果这些数据真的来自
VARBINARY(MAX)
另一个表中的字段,那么它是如何以字符串结尾的呢?移动它的最简单方法是:UPDATE cl
SET cl.Photo = src.SomeField
FROM Client cl
INNER JOIN SomeTable src
ON src.JoinField = cl.JoinField
WHERE something? = somethingElse?;
VARBINARY(MAX)
多变的:DECLARE @Photo VARBINARY(MAX);
SELECT @Photo = src.photo
FROM SomeTable src
WHERE src.SomeField = ?;
UPDATE cl
SET cl.Photo = @Photo
FROM Client cl
WHERE cl.[id] = '40946b09-81be-42b0-ae62-63182acb1e89';
关于SQL Server 插入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35411679/