4

SQL を使用して、理想的には ADO (クラシック) & VBScript (または Visual Basic 6) で数バイトを Binary (または varbinary) フィールドに渡す方法を知っている人はいますか?

10 ~ 20 (おそらくそれ以上) バイトのデータをエンコードし、このデータを SQL db フィールドに格納したいと考えています。(MS-SQLSVR ではありませんが、標準の SQL サポート形式が機能することを願っています!)

バイトは、AscB/ChrB を介して取得されたバイトの文字列、または「バイト」の配列 (実際には「cbyte」を介して取得されたバイト型のバリアント) として利用でき、配列に格納されます。

最初のオプション: 文字列形式 を使用して、次のように SQL 挿入を作成することに (限定的に) 成功しました。

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

しかし、文字列のヌルによってフィールド内のデータが切り捨てられ、その他の印刷されない制御文字がデータの処理の邪魔になるのではないかと心配しています。これを回避する方法はありますか?

2 番目のオプション: バイト配列 データを配列に入れるのは簡単ですが、SQL Insert ステートメントに渡す方法がわかりません。12 バイトを渡そうとすると、CAST がデータを整数 (4 バイト) に格納しようとするため、挿入は失敗します。1 バイトを渡すと、次のように機能します。

x = a(0)

4 バイトの間は引き続き機能しますが、整数がオーバーフローすると失敗します。また、データを並べ替えます

私はさまざまな回避策を使用しようとしました:

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 ベースのソリューションを使用できます。これを「生の」バイナリとして使用したいのですが、Base64 のような ascii エンコーディングは使用したくありません。

私はしびれるまでグーグルで検索しましたが、SQLのバイナリフィールドに関連するものはまったく見つかりませんでした。

手伝ってくれますか?どんな答えでも大歓迎です。多くのthx。

4

3 に答える 3

5

従来の ADO は、非常に大きな (>8000) varbinary および image (blob) フィールドをチャンク化せずに直接操作できます。以下は、INT ID フィールドと varbinary(100) フィールドを持つテーブルにバイナリ データを挿入する MS SQL Server に対するサンプルです。この例では、パラメーター化された SQL クエリは、バリアントからバイナリ データを挿入しています。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
于 2009-05-29T02:06:58.190 に答える
1

VB6 は、ADO フィールド クラスの GetChunk および AppendChunk メソッドを使用してバイナリ列にアクセスできます。このKB 記事を参照してください。

このブログ投稿には、16 進文字列を 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
于 2009-05-28T19:49:07.003 に答える
1

Matt は私に解決策を教えてくれました: ターゲットは BLOB フィールドではなく、コードの大部分は ADO を介して文字列をデータベースに渡す方法を示していますが、必要なビットは、フィードするバイトを作成する方法でした。 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
于 2009-05-31T20:39:12.257 に答える