将C#转换后的base64存储为SQL Server varbinary(max)
我有一个angular webapp,我接受base64中的图像,并将它们存储在T-SQL varbinary中。但是,我在SQLServer中存储的现有数据似乎是另一个二进制文件。我需要两个二进制文件在C#中使用相同的读取/更新方法 在该服务中,我试图将base64字符串转换为SQL Server的varbinary,反之亦然 在SSMS中,我可以手动获取base64字符串并插入到一行中,如下所示:将C#转换后的base64存储为SQL Server varbinary(max),c#,sql-server,C#,Sql Server,我有一个angular webapp,我接受base64中的图像,并将它们存储在T-SQL varbinary中。但是,我在SQLServer中存储的现有数据似乎是另一个二进制文件。我需要两个二进制文件在C#中使用相同的读取/更新方法 在该服务中,我试图将base64字符串转换为SQL Server的varbinary,反之亦然 在SSMS中,我可以手动获取base64字符串并插入到一行中,如下所示: Cast(@base64ImgStr as varbinary(max)) cast(''
Cast(@base64ImgStr as varbinary(max))
cast('' as xml).value('xs:base64Binary(sql:variable("@source"))', 'varchar(max)')
Encoding.ASCII.GetString(varbinary)
但是当我尝试从C#插入时,结果是不同的:
(输入相同)。由于二进制文件不同,因此图像不会显示。我需要一个C#中的方法,它提供与T-SQL中相同的二进制文件
我必须了解解决方案,因为我可以在SQL Server中强制转换并获得正确的base64(同样,不是在C#中),如下所示:
Cast(@base64ImgStr as varbinary(max))
cast('' as xml).value('xs:base64Binary(sql:variable("@source"))', 'varchar(max)')
Encoding.ASCII.GetString(varbinary)
我得到的不是base64而是Unicode符号,否则我会粘贴到示例中
我需要在不调用SQL Server base64Binary方法的情况下获取base64,因为我的服务读取的图像如下:
Cast(@base64ImgStr as varbinary(max))
cast('' as xml).value('xs:base64Binary(sql:variable("@source"))', 'varchar(max)')
Encoding.ASCII.GetString(varbinary)
如果我将手动插入的varbinary(Cast(@base64ImgStr as varbinary(max)))转换为varchar(max),我会得到一个base64字符串,并且图像会适当地显示在我的webapp中。
但是,当我使用C#方法创建二进制文件时,情况并非如此。对于我从Convert.FromBase64String(base64)获得的varbinary类型,我需要在SQL Server中进行中间转换(xs:base64binary)以将二进制文件反转为base64。没有中间转换,我得到Unicode符号,在webapp中没有图像显示。我不希望中间转换,因为无论是用户上传图像还是有人手动插入图像,我都希望得到一致的结果
我在Convert类上没有看到一个方法提供相同类型的二进制文件。但这似乎正是我需要的。我怀疑是Unicode。请帮忙 这对我很有用:
var image = Convert.FromBase64String(base64);
string hex = BitConverter.ToString(image);
hex = hex.Replace("-", "");
hex = "0x" + hex;
此十六进制可以保存在
varbinary(MAX)
字段中,无需强制转换或转换,并将在浏览器中显示为图像。要存储图像本身,请使用Convert.FromBase64String(base64)的结果应存储代码>Cast(@base64ImgStr as varbinary(max))
将存储base64编码图像的二进制表示形式-您在回读时是否从base64解码/使用base64?以下是我存储更新图像的步骤:pm.SponsorImg=Convert.FromBase64String(vm.SponsorImg)
(继续回答-brb)因此我相信我正在存储Convert.FromBase64String(base64)
的结果。但是,当我拍摄相同的图像并执行Cast(@base64ImgStr as varbinary(max))
时,该字节数组不会显示与存储的varbinary相同的varbinary。下面是我回过头来阅读的方式:var base64=pm.SponsorImg!=无效的Encoding.ASCII.GetString(pm.SponsorImg):String.Empty代码>我需要继续以这种方式读回,因为图像将手动转换并通过angular上传。您似乎在编码.ASCII.GetString(varbinary)
时出错。如果varbinary是您的数据,并且您想要一个base64编码的字符串,那么您应该使用Convert.ToBase64String
将字节数组转换为。您所说的二进制输入是字符串的二进制表示(即字节表示ascii字符,而不是base64编码的字节)。@,似乎您提供了答案。很抱歉,一开始我不理解你的建议。不知道如何给你更多的信用-谢谢你的帮助。有没有一个PHP相当于这个?我不知道。