Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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
将C#转换后的base64存储为SQL Server varbinary(max)_C#_Sql Server - Fatal编程技术网

将C#转换后的base64存储为SQL Server varbinary(max)

将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(''

我有一个angular webapp,我接受base64中的图像,并将它们存储在T-SQL varbinary中。但是,我在SQLServer中存储的现有数据似乎是另一个二进制文件。我需要两个二进制文件在C#中使用相同的读取/更新方法

在该服务中,我试图将base64字符串转换为SQL Server的varbinary,反之亦然

在SSMS中,我可以手动获取base64字符串并插入到一行中,如下所示:

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相当于这个?我不知道。