创建insert语句来插入varbinary blob

本文关键字:varbinary blob 插入 insert 语句 创建 | 更新日期: 2023-09-27 18:06:06

我想从我的数据库导出一些数据,并创建一个insert语句,将这些数据插入到另一个数据库与c#。

我做了几乎所有工作的脚本(和类型),但当我试图在我的一个表中使用它,其中有一个名为Contentos的字段,这是type VARBINARY(max)我不能让它工作。

现在我必须选择该数据,我通过使用将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');

内容(例如):

504 b03041400000008091043e288e9e0d9ec7c1ceb6cf6a7e9290d5a4b04179e2a1b8fe350341542ea67dccd96dc5e682fd14e7a61e70000002a0300000000

结果:不能隐式地将类型varchar转换为varbinary(max)。使用convert函数

好吧,我们开始吧!内容(例如):

转换(varbinary (max), 504 b03041400000008091043e288e9e0d9ec7c1ceb6cf6a7e9290d5a4b04179e2a1b8fe350341542ea67dccd96dc5e682fd14e7a61e70000002a0300000000)

结果:

转换为uniqueidentifier时出错。

模式是这样的:

  • Id: uniqueidentifier
  • SomeID: uniqueidentifier
  • 名称:nvarchar (max)
  • 师范学院:varbinary (max)
  • LastChange: datetime
  • LastChangeId: uniqueidentifier

不管我怎么做,这都行不通。

所以我想知道如何

  1. 正确地从读取器读取信息(我目前使用:)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

应该使用参数化查询:

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

创建insert语句来插入varbinary blob

您应该使用参数化查询:

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

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

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

  • security:防止SQL注入攻击
  • 性能:由于查询的文本总是相同的,SQL Server可以缓存执行计划
  • 可靠性:你不需要担心值(数字,日期…)应该如何格式化,这是自动处理的。例如,不存在由于文化不同而导致格式错误的风险。

SQL Server中BLOB字面值的格式是0x<hex-value>(不带引号)。在你的例子中是0x504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000