有没有人知道如何使用SQL将几个字节传递到二进制(或varbinary)字段,理想情况是ADO(经典)& VBScript(或Visual Basic 6)?
我希望编码10-20(可能更多)字节的数据,并将此数据存储在SQL db字段中。 (它不是MS-SQLSVR,但我希望标准的SQL支持格式能够正常工作!)
这些字节可用作通过AscB / ChrB获得的字节串,OR,一个'bytes'数组(实际上是通过'cbyte'获得的字节类型的变体)并存储在数组中。
第一个选项:使用字符串格式 我有一些(有限的)成功创建SQL插入:
x = ".>?hD-&91k[=" '<psuedo string of chars, some unprintable
Insert Into rawtest (byt) Values (CAST('" & x & "' as SQL_BINARY(12)))
但我担心字符串空值会截断字段中的数据,而其他非打印控制字符会妨碍处理数据。有没有办法避免这种情况?
第二个选项:字节数组 我可以很容易地将数据放在一个数组中,但是无法看到如何传递给SQL Insert语句。如果我尝试传入12个字节,则由于CAST尝试将数据存储到整数(4字节),插入失败。如果我传入一个字节,它就可以工作,例如:
x = a(0)
继续工作4个字节,但在Integer溢出时失败。此外,它重新排序数据
我试图使用各种解决方法:
Insert Into rawtest (byt) Values (CAST('12,34,45' as SQL_BINARY(12)))
Insert Into rawtest (byt) Values (CAST(&h12&h34 as SQL_BINARY(12)))
Insert Into rawtest (byt) Values (CAST(0x123456789012 as SQL_BINARY(12)))
我也尝试过类似的组合:
Insert Into rawtest (byt) Values (CONVERT('" & x & "', SQL_BINARY)
但这些都失败了!
理想情况下,我想要一个方法,任何方法,它采用一个最多20个字节的小二进制数组(理想情况下完整字节范围为0-255,但可能需要更少)并将它们传递给一个普通的原始二进制SQL领域。
理想情况下,我需要在VBScript / ADO中执行此操作,但如果可用,则可以使用基于VB6的解决方案。我想把它作为'原始'二进制文件,我不想使用ascii编码,比如Base64。
我用Google搜索,直到我麻木,并且在SQL中没有找到与二进制字段相关的内容。
你能帮忙吗?任何答案都赞赏。很多人。答案 0 :(得分:5)
经典ADO可以直接操作非常大(> 8000)varbinary和image(blob)字段而无需分块。下面是针对MS SQL Server的示例,它将二进制数据插入到具有INT ID字段和varbinary(100)字段的表中。在此示例中,参数化SQL查询正在从Variant插入二进制数据。 Variant只需要填充二进制数据。
Dim vntBlobData As Variant
vntBlobData = "ReplaceThisWithBinaryData - A byte array will work"
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider = sqloledb; Data Source = DBServerName; Initial Catalog = DBName; User ID = UserID; Password = Password; Persist Security Info = False"
cn.Open
Dim strQry As String
strQry = "INSERT INTO TestBinaryTable (ID, BlobData) VALUES (?, ?)"
Dim cm As ADODB.Command
Set cm = New ADODB.Command
cm.ActiveConnection = cn
cm.CommandText = strQry
cm.Parameters.Append cm.CreateParameter("@ID", adInteger, adParamInput, , 1)
cm.Parameters.Append cm.CreateParameter("@BlobData", adVarBinary, adParamInput, 100, vntBlobData)
cm.CommandType = adCmdText
cm.Execute
答案 1 :(得分:1)
VB6可以使用ADO字段类的GetChunk和AppendChunk方法访问二进制列。请参阅此KB article。
此blog post具有将十六进制字符串转换为varbinary的功能:
CREATE FUNCTION dbo.HexStrToVarBinary(@hexstr varchar(8000))
RETURNS varbinary(8000)
AS
BEGIN
DECLARE @hex char(1), @i int, @place bigint, @a bigint
SET @i = LEN(@hexstr)
set @place = convert(bigint,1)
SET @a = convert(bigint, 0)
WHILE (@i > 0 AND (substring(@hexstr, @i, 1) like '[0-9A-Fa-f]'))
BEGIN
SET @hex = SUBSTRING(@hexstr, @i, 1)
SET @a = @a +
convert(bigint, CASE WHEN @hex LIKE '[0-9]'
THEN CAST(@hex as int)
ELSE CAST(ASCII(UPPER(@hex))-55 as int) end * @place)
set @place = @place * convert(bigint,16)
SET @i = @i - 1
END
RETURN convert(varbinary(8000),@a)
END
答案 2 :(得分:1)
Matt给了我一个解决方案:虽然目标不是blob字段,但是大部分代码都表明如何通过ADO将字符串传递到db中,我需要的是如何创建字节通过使用charb / ascb从源字节创建VBS'字节字符串'来输入变量'vntBlobData'我得到了我的解决方案。我现在有一个VBS解决方案(并使用正确的字节数组,也是一个VB6解决方案!)非常感谢Matt。
'VBS $ 2Bin:
Function a2b(x)
For i = 1 To Len(x)+1 Step 2
d = Mid(x, i, 2)
a2b = a2b & chrb(CByte(d))
Next
End Function
'VBS Bin2 $
Function eb2s(c)
If IsNull(c) Then
eb2s = ""
else
For i = 1 To lenb(c)
eb2s = eb2s & ascb(Midb(c, i, 1))
Next
End if
End Function