创建插入语句以插入 varbinary blob

Create insert statement to insert varbinary blob

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

我编写的脚本几乎适用于所有内容(和类型),但是当我尝试在我的一个表中使用它时,它有一个名为 Contentos 的字段,属于 type VARBINARY(max) 我无法正常工作。

现在我必须 select 该数据,这是我通过使用一种方法实现的,该方法将 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');

内容(举例):

'504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000'

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

好的,开始吧! 内容(举例):

CONVERT(varbinary(max), '504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000')

结果:

Error at converting to uniqueidentifier.

架构是这样的:

无论我做什么,这都行不通。

所以我想知道如何

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

非常感谢!!!

[编辑]

这是最终对我有用的东西:

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

ByteArrayToHexConverter 没有什么特别的,只是将字节数组转换为十六进制(顾名思义:b) 我还必须让服务器将它从十六进制字符串转换回原来的 byte[]

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

的回答

You should use a parameterized query:

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

您应该使用参数化查询:

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

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

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

  • 安全性:这可以防止 SQL 注入攻击
  • 性能:由于查询的文本总是相同的,SQL服务器可以缓存执行计划
  • 可靠性:您无需担心应如何格式化值(数字、日期...),这是自动处理的。例如,不存在因不同文化而导致格式不正确的风险。

SQL 服务器中 BLOB 文字的格式是 0x<hex-value>(无引号)。所以在你的情况下它将是 0x504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000.