【问题标题】:How to insert base64string to varbinary type column sql sever [duplicate]如何将base64字符串插入varbinary类型列sql server [重复]
【发布时间】:2018-09-11 07:31:21
【问题描述】:

我有base64string(图像标志),我想将它插入到数据库中。在数据库中,列类型是 varbinary。我的查询是

update Organization set MobileLogo='gjdgfkjgk...' where orgId=1676

我得到以下错误

消息 257,级别 16,状态 3,行 1 从数据类型隐式转换 varchar(max) 到 varbinary(max) 是不允许的。使用转换 运行此查询的函数。

图片转base64的代码

string imagePath = @"C:\Users\arvind.ch\Downloads\Icons\SISClient_iCons\Enrich.png";
string imgBase64String = GetBase64StringForImage(imagePath);

这里我要存储图片-

我需要有 sql 查询才能将其插入到 db 而不是 C# 代码。上面给出的 URL 都是关于 C# 的

【问题讨论】:

  • base 64 是一种获取任意二进制数据并将其作为字符串存储/传输的方法。你有一个varbinary 列,它能够存储任意二进制数据。你可能认为你在这里错过了明显的东西吗?
  • 不要转换为 base 64 / decode base 64 以返回任意二进制数据。然后在varbinary 参数中直接将其传递给SQL Server,并避免 将其视为字符串。它最自然的表示是二进制数据。 存储它
  • 发布存储图像的实际代码。不是将其转换为字符串的代码。

标签: sql sql-server


【解决方案1】:

要正确回答这个问题需要两件事:

首先,让我们回答您关于如何存储对象的问题。您已经创建了一个 varbinary 列,因此不必担心 Base64 转换,因为 varbinary 列已经可以存储任意数据。将文件读入字节数组,然后发送到数据库。

其次,也许是什么让这看起来很难做到,是您需要参数化您的 SQL。这有两个原因:1)允许您首先发送字节数组;2)防止 SQL 注入攻击,这是最容易防御的漏洞。

考虑下面的代码,它可以做到这两点:

using ( SqlConnection con = new SqlConnection ("your connection string"))
using ( SqlCommand com = new SqlCommand("UPDATE Organization SET MobileLogo=@FileData WHERE YourKeyColumn=@YourKeyValue", con) { CommandType = CommandType.StoredProcedure } )
{
    con.Open();
    com.Parameters.AddWithValue("@FileData", yourByteArray);
    com.Parameters.AddWithValue("@YourKeyValue", yourKeyValue);
    com.ExecuteNonQuery();
}

【讨论】:

  • @dodexahedron- 谢谢你。但我正在使用 Sql-server 将图像插入数据库。使用 C# 将图像转换为 base64。
  • @Arvindraja 不要使用 C# 将二进制数据转换为字符串。 varbinary(max)二进制 类型。 Base64 是一个字符串。将二进制数据存储在 varbinary(max) 字段中
  • 是的!现在正在尝试将图像转换为二进制。
  • @Arvindraja 为什么要转换任何东西?只需加载图像文件。也许您应该澄清您的问题并发布您正在使用的实际代码?
  • 图像已经二进制。不要将其转换为字符串。只需将文件读入字节数组即可。
【解决方案2】:

SQL Server 告诉你一切:

使用CONVERT 函数运行此查询。

这里是更新的查询:

update Organization set MobileLogo=convert(varbinary(MAX),'gjdgfkjgk...') where orgId=1676

您还可以使用Convert.FromBase64String 在客户端转换值:

var varbinaryData = Convert.FromBase64String("gjdgfk45vbgu");

更新问题更新后:

要将文件读取为字节数组,请使用:

var imagePath = @"C:\Users\arvind.ch\Downloads\Icons\SISClient_iCons\Enrich.png";
var byteArray = File.ReadAllBytes(imagePath);

然后将此byteArray 作为查询参数传递。

【讨论】:

  • 当我这样做时,收到错误消息 - 消息 9002,级别 17,状态 2,第 1 行数据库“TestDb”的事务日志已满由于“LOG_BACKUP”。
  • Convert.FromBase64String("gjdgfk45vbgu"),这一行给了我像 03 56 66 77 这样的二进制数组...我该如何收集它?
猜你喜欢
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多