创建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
不管我怎么做,这都行不通。
所以我想知道如何
- 正确地从读取器读取信息(我目前使用:)
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
应该使用参数化查询:
INSERT INTO [My.Cool.DBA].[dbo].][文档]([Id], [SomeID], [Name],[contenttos], [LastChange], [LastChangeId]) VALUES (@Id, @SomeId,@Name, @ contenttos, @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
添加参数
使用参数化查询有多个优点:
- security:防止SQL注入攻击
- 性能:由于查询的文本总是相同的,SQL Server可以缓存执行计划
- 可靠性:你不需要担心值(数字,日期…)应该如何格式化,这是自动处理的。例如,不存在由于文化不同而导致格式错误的风险。
SQL Server中BLOB字面值的格式是0x<hex-value>
(不带引号)。在你的例子中是0x504B03041400000008091043E288E9E0D9EC7C1CEB6CF6A7E9290D5A4B04179E2A1B8FE350341542EA67DCCD96DC5E682FD14E7A61E70000002A0300000000