¿Alguien sabe cómo pasar varios bytes en un archivo Binario (o varbinary) campo de uso de SQL y lo ideal en ADO (clásico) & VBScript (Visual Basic 6)?

Deseo para codificar 10-20 (tal vez más) bytes de datos y los datos almacenados en una bd de SQL campo. (No es de MS-SQLSVR, pero tengo la esperanza de que un estándar de SQL formato compatible funcione!)

Los bytes están disponibles como una cadena de bytes obtenidos a través de la ChrB, O, una matriz de ‘bytes’ (en realidad variantes de tipo byte obtenidos a través de la ‘cbyte’) y almacenados en la matriz.

Primera opción: utilizar el formato de cadena
He tenido algunos (limitado) el éxito de la creación de la insert de SQL como:

x = ".>?hD-&91k[="    '<psuedo string of chars, some unprintable
Insert Into rawtest (byt) Values (CAST('" & x & "' as SQL_BINARY(12)))

Pero me preocupa que la cadena de valores nulos va a truncar los datos en el campo y no en la impresión de los caracteres de control se pondrá en el camino de la manipulación de los datos. Hay una manera de evitar esto?

Segunda Opción: Matriz De Bytes
Puedo poner los datos en una matriz bastante fácilmente, pero no se puede ver cómo pasar a la instrucción SQL Insert. Si intento pasar en 12 bytes, falla la inserción debido a que el ELENCO tratando de guardar los datos en un número Entero (4bytes). Si me pasan en un solo byte, no funciona, por ejemplo:

x = a(0)

Y continúa trabajando para 4 bytes, pero falla cuando los desbordamientos de Enteros. También, se reordena los datos

He intentado utilizar diferentes soluciones:

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)))

También he intentado combinaciones similares con:

Insert Into rawtest (byt) Values (CONVERT('" & x & "', SQL_BINARY)

Pero no todos!

Idealmente, quiero un método, el método, que lleva a un pequeño binario matriz de hasta 20 bytes(idealmente total de bytes en el rango 0-255, pero podría tomar menos) y pasa a través de una llanura, raw, binarios de SQL campo.

Idealmente necesito hacer esto en VBScript/ADO, pero puede tomar un VB6 solución basada en si está disponible. Quiero que este como ‘raw’ binario, no quiero usar un ascii de codificación, como Base64.

He buscado en google, hasta que yo estoy entumecido y aun no no se encuentra mucho atall pertinentes a los campos binarios de SQL.

Puede usted ayudar? Las respuestas apreciado. Muchas thx.

  • Para que quede claro, estoy buscando a la tienda binario en la mesa, no como un ‘adjunto’ memo binario/blob/tipo de imagen de campo.
InformationsquelleAutor andora | 2009-05-28

3 Comentarios

  1. 5

    ADO clásico puede manipular muy grande (>8000) varbinary y la imagen (blob) campos directamente sin fragmentar. A continuación se muestra un ejemplo en contra de MS SQL Server con la que inserta los datos binarios en una tabla con un INT ID de campo y de tipo varbinary(100) de campo. En este ejemplo SQL parametrizada consulta es la inserción de los datos binarios de una Variante. La Variante sólo debe rellenarse con los datos binarios.

    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
  2. 1

    VB6 puede acceder a las columnas binarias con el GetChunk y AppendChunk de la ADO campo de la clase. Ver este Artículo de KB.

    Este blog tiene una función para convertir una cadena hexadecimal a un 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
    • Gracias por la sugerencia, pero no un campo BLOB, pero normal/binario (o podría ser varbinary) campo almacenado en la tabla. Me tienes pensando tú, tal vez algunos otros ado tipo de flujo de la función podría ayudar…
  3. 1

    Matt me dio una introducción a la solución: Aunque el objetivo no es un campo blob y la mayor parte del código indictaes cómo pasar una cadena en la base de datos a través de ADO, el bit que yo necesitaba era cómo crear los bytes para alimentar a la variable ‘vntBlobData’, mediante la creación de un VBS ‘cadena de bytes» de la fuente de bytes mediante charb/bcsv tengo mi solución. Ahora tengo un VBS solución (y el uso de una adecuada matriz de bytes, un VB6 solución demasiado!) Muchas gracias 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

Dejar respuesta

Please enter your comment!
Please enter your name here