プロが教える店舗&オフィスのセキュリティ対策術

VB6から『画像ファイル(.bmpと.jpg)』、『テキストファイル(.txt)』を
SQLServerデータベースに保存するといったものを作成しようとしています。

フィールドのデータ型は、画像をimage型、テキストをvarbinary型に設定したいと考えておりまして、画像の方は、Byte型に代入後、LoadFromFileメソッドやWriteTextメソッドで保存や取込が出来たのですが、テキストの方が、同じようにByte型に代入までは出来たものの、その先どのようにして保存(取込)をして良いか分かりません。(エラーになってしまいます。)
テキストの方もデータ型をimage型にするしか方法はないのでしょうか?
何か良い方法があれば教えていただけませんでしょうか?
宜しくお願いします。

A 回答 (5件)

この手の質問にはバージョンを記載することをお勧めします(特にLOBは2005と2000で大幅に違います)。


image & varbinaryということで、SQL Server 2000でいいですか?
テキストファイルをtext型でなく敢えてバイナリ保管する理由はなんですか?セキュリティですか?

ADO.Streamを使って書き込めば、imageでもvarbinary(8000)でも、textでも問題なく読み書きできます。

バイナリの最もシンプルな例は以下です。
Sub test()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim st As New ADODB.Stream

cn.Open "接続文字列"
st.Open
st.Type = adTypeBinary
st.LoadFromFile "C:\TextFile.txt"

rs.Open "SELECT * FROM テーブル", cn, adOpenKeyset, adLockOptimistic
rs.AddNew
rs.Fields("F1").Value = st.Read
rs.Update

rs.Close
st.Close
cn.Close

Set st = Nothing
Set rs = Nothing
Set cn = Nothing
End Sub
    • good
    • 0
この回答へのお礼

> jamshid6さん
早速の回答ありがとうございます。

例に書いていただいた方法を取っているのですが、varbinaryにすると
「複数ステップの OLE DB の操作でエラーが発生しました。各 OLE DB の状態の値を確認してください。作業は終了しませんでした。」というエラーとなってしまいます。(例の中でいうと、「rs.Fields("F1").Value = st.Read」のところで)
ちなみにSQLServerは2000ですが、2005でも使用するようになります。
とりあえず、2000で動けばいいのですが・・。

お礼日時:2008/12/25 16:53

一番可能性が高いのは、「バイナリ形式で読みだしていない」ことです。



同じようにやっているとのことですが、テキストファイルだからテキストのままバイトで切りだしたりしていませんか?
(上記の例ではst.Type=adTypeText)
その場合は、全く同じエラーが起こると思います。
    • good
    • 0
この回答へのお礼

していないと思います。
ちなみに・・。
adTypeBinaryで先程のエラーが出てしまい、adTypeTextだと「このコンテキストで操作は許可されていません。」が出てしまいます。

お礼日時:2008/12/25 18:28

なるほどねー。



もう1つ可能性がありました。それはファイルサイズが8000バイトを超えているということです。
SQL Server 2000ではvarbinaryの最大長は8000です。
従って、それが理由ならば打つ手はありません(imageしかないです)。

SQL Server 2005ではvarbinary(MAX)に入れればいいんですけどね。
    • good
    • 0
この回答へのお礼

ファイルサイズは、2KBなんですが・・。
0KBで試しても同じエラーになってしまいました。

お礼日時:2008/12/26 13:16

テーブル定義を確認してください。


varbinaryの長さは指定しましたか?
varbinary(1)とかになっていませんか?
    • good
    • 0
この回答へのお礼

varbinary(50)でした。

お礼日時:2008/12/26 17:53

つまり50バイト(半角50文字)しか保管できないということですね。


そこは4000とか8000とかにしないとだめですね。
    • good
    • 0
この回答へのお礼

>jamshid6様
すみません。少し勘違いもしていました。

4000にしたところ、無事解決しました。
ご丁寧に何度も助言頂きまして、本当にありがとうございました。

お礼日時:2008/12/27 10:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す