创建插入语句以插入varbinary blob

时间:2015-08-03 09:13:10

标签: c# sql-server blob sql-insert varbinary

我想从我的数据库导出一些数据并创建一个Insert语句,用C#将这些数据插入到另一个数据库中。

我制作了几乎所有东西(和-type)的脚本,但是当我尝试在我的一个表格中使用它时,它有一个名为Contentos的字段type VARBINARY(max)我可以&# 39;让它发挥作用。

现在我必须选择那些数据,我通过使用将System.Binary[](我在读取列时得到的)转换为十六进制字符串的方法来实现。

但不幸的是,我在插入数据时失败了......

我正在尝试这样的事情:

INSERT INTO [My.Cool.DBA].[dbo].[Documentos] ([Id], [SomeID], [Name], [Contentos], [LastChange], [LastChangeId]) VALUES ('693c9644-f2b5-4c74-a633-f4942fc1d8e5', 'bca2ac27-71e0-4641-a4b0-3c3e39916e71', 'Whats that', [--> here goes the content <--], '07.08.15 11:18:34:383', '693c9344-f8b5-4d74-a633-f4942fc1d8e5');

内容(例如):

  

&#39; 504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000&#39;

结果:无法将varchar类型隐式转换为varbinary(max)。使用CONVERT函数

好的,让我们来做吧! 内容(例如):

  

CONVERT(varbinary(max),&#39; 504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000&#39;)

结果:

  

转换为uniqueidentifier时出错。

架构是这样的:

  • Id:uniqueidentifier
  • SomeID:uniqueidentifier
  • 名称:nvarchar(max)
  • Contentos:varbinary(max)
  • LastChange:datetime
  • LastChangeId:uniqueidentifier

无论我做什么,这都不会奏效。

所以我想知道如何

  1. 正确阅读读者的信息 (我目前正在使用:)sb.Append(String.Format("'{0}'", ByteArrayToHexViaLookup32((Byte[])reader[j])));
  2. 正确创建一个插入查询,将数据插入db:)
  3. 非常感谢提前!!!

    [编辑]

    这是最终对我有用的事情:

    string.Format("CONVERT(VARBINARY(max), 0x{0})", ByteArrayToHexConverter.ByteArrayToHexViaLookup32((byte[])value));

    ByteArrayToHexConverter没有什么特别的,只需将Bytearray转换为Hex(正如名称所示:b) 此外,我不得不让服务器将其从十六进制字符串转换回原来的byte[]

    注意:我需要这个能够从文本文件中执行生成的语句。所以如果你没有这个要求,我建议你看一下 Thomas Levesque的答案

      

    您应该使用参数化查询:

         

    INSERT INTO [My.Cool.DBA]。[dbo]。[Documentos]([Id],[SomeID],[Name],   [Contentos],[LastChange],[LastChangeId])VALUES(@Id,@ SomeId,   @ Name,@ Conostos,@ LastChange,@ LastChangeId);

1 个答案:

答案 0 :(得分:1)

您应该使用参数化查询:

INSERT INTO [My.Cool.DBA].[dbo].[Documentos] ([Id], [SomeID], [Name], [Contentos], [LastChange], [LastChangeId])
VALUES (@Id, @SomeId, @Name, @Contentos, @LastChange, @LastChangeId);

使用SqlCommand上的AddAddWithValue方法将参数添加到command.Parameters

使用参数化查询有多个优点:

  • 安全性:这可以防止SQL注入攻击
  • 性能:由于查询文本始终相同,因此SQL Server可以缓存执行计划
  • 可靠性:您不必担心应如何格式化值(数字,日期......),这是自动处理的。例如,由于文化不同,不存在格式错误的风险。

SQL Server中BLOB文字的格式为0x<hex-value>(无引号)。因此,在您的情况下,它将是0x504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000