创建插入语句以插入 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
.
架构是这样的:
- Id : 唯一标识符
- SomeID: 唯一标识符
- 名称:nvarchar(最大值)
- 内容:varbinary(max)
- 上次更改时间:日期时间
- LastChangeId: 唯一标识符
无论我做什么,这都行不通。
所以我想知道如何
- 正确阅读reader中的信息
(我目前正在使用:)
sb.Append(String.Format("'{0}'", ByteArrayToHexViaLookup32((Byte[])reader[j])));
- 正确创建一个插入查询,将数据插入数据库 :)
非常感谢!!!
[编辑]
这是最终对我有用的东西:
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
上使用 Add
或 AddWithValue
方法将参数添加到 SqlCommand
。
使用参数化查询有多个优点:
- 安全性:这可以防止 SQL 注入攻击
- 性能:由于查询的文本总是相同的,SQL服务器可以缓存执行计划
- 可靠性:您无需担心应如何格式化值(数字、日期...),这是自动处理的。例如,不存在因不同文化而导致格式不正确的风险。
SQL 服务器中 BLOB 文字的格式是 0x<hex-value>
(无引号)。所以在你的情况下它将是 0x504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000
.
我想从我的数据库中导出一些数据并创建一个插入语句以使用 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
.
架构是这样的:
- Id : 唯一标识符
- SomeID: 唯一标识符
- 名称:nvarchar(最大值)
- 内容:varbinary(max)
- 上次更改时间:日期时间
- LastChangeId: 唯一标识符
无论我做什么,这都行不通。
所以我想知道如何
- 正确阅读reader中的信息
(我目前正在使用:)
sb.Append(String.Format("'{0}'", ByteArrayToHexViaLookup32((Byte[])reader[j])));
- 正确创建一个插入查询,将数据插入数据库 :)
非常感谢!!!
[编辑]
这是最终对我有用的东西:
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
上使用 Add
或 AddWithValue
方法将参数添加到 SqlCommand
。
使用参数化查询有多个优点:
- 安全性:这可以防止 SQL 注入攻击
- 性能:由于查询的文本总是相同的,SQL服务器可以缓存执行计划
- 可靠性:您无需担心应如何格式化值(数字、日期...),这是自动处理的。例如,不存在因不同文化而导致格式不正确的风险。
SQL 服务器中 BLOB 文字的格式是 0x<hex-value>
(无引号)。所以在你的情况下它将是 0x504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000
.