目的: VB.NETを使用してParadoxデータベースからBLOBフィールドを読み取ります。私がこれまでに行うことができるよ何VB.NETからParadoxでBLOBフィールドを読み取る
:データベースと変更(非BLOB)値に
接続します。 Great!*
(BLOBフィールドを含む)テーブル全体をDataGridに読み込みます(OledbDataAdapter.FillをItemsSourceとして使用)。ただし、BLOBフィールドには多くの迷惑メールが含まれています。
は*私の接続文字列は、これまでのWindows 10での私のODBCデータソースAdnimistratorを通じて(下記のコードでABADBという名前の)ユーザーDSNを参照している、私は「doesnの接続文字列を作るにはあまりにもダムように見えますtはDSNに依存します。ここのヒントも大歓迎です。
仕事に何をしていないようです:
- CONVERTのSQLコマンドを使用して(このエラー:クエリ式で[Microsoft]の[ODBCパラドックスドライバー]構文エラー(演算子がありません)「(CONVERT OledbDataReader.GetBytes からUTF8を使用説明「)。)
FileStream.Writeストリーム(これはいくつかのBLOBフィールドに動作しますが、すべてではないと、データグリッドに表示されたものとは異なっているジャンク文字が含まれています。不可解な理由は、いくつかの一部だけBLOBフィールドが解釈される。System.Text.Encoding でエンコード正しく)
のDebug.Printバイト(すべてのBLOB値のためにジャンク文字を与える - たまに読み値を与えるFileStream.Writeに用いたものと同じバイトストリームを使用しているにもかかわらず)
- - DataGridの(データグリッド自体は正しくBLOBフィールドを読み、前と後のジャンク文字を追加しないことに注意してください奇妙なことに、私は文字Gを取得)から直接
のDebug.Print BLOB値
Debug.P DataGridののためのItemsSourceとして使用したDataTableから直接RINT BLOB値(上記と同じ問題が - それだけ読み出すG)
次は何? 私はExcel/OfficeでVBAを経験していますが、VB.NETで未経験であるため、私は下のコードで何か愚かなことをしているかもしれません。私はOledbDataReader.GetCharsを試みましたが、まだ成功していません。私は、他のライブラリ/ツールについても簡単に見てきました。
ご了承ください。
(余分なジャンク文字付き)successfulyたDataGridの写真やコードスニペット:
しようとするとSQLのCONVERT:
Dim CN As New OdbcConnection("Dsn=ABADB;dbq=" & strDBPath & ";defaultdir=" & strDBPath & ";driverid=538;fil=Paradox 5.X;maxbuffersize=2048;pagetimeout=5;uid=admin")
Dim CMD As New OdbcCommand("SELECT CONVERT (Description USING utf8) FROM slptrans WHERE RecordID=2", CN) 'recordID 2, 3 or 4. 2 is interpreted correctly; 3 and 4 are not.
CN.Open()
Dim DR As OdbcDataReader = CMD.ExecuteReader()
DR.Read()
Debug.Print(DR(0))
は、このことから値を取得できませんメソッドとしてエラーが発生します。 FileStream.WriteとSystem.Text.Encodingから
:TXTファイルから
Dim CN As New OdbcConnection("Dsn=ABADB;dbq=" & strDBPath & ";defaultdir=" & strDBPath & ";driverid=538;fil=Paradox 5.X;maxbuffersize=2048;pagetimeout=5;uid=admin")
Dim CMD As New OdbcCommand("SELECT Description FROM slptrans WHERE RecordID=2", CN) 'recordID 2, 3 or 4. 2 is interpreted correctly; 3 and 4 are not.
CN.Open()
Dim DR As OdbcDataReader = CMD.ExecuteReader()
DR.Read()
Dim bytBLOB(DR.GetBytes(0, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte
DR.GetBytes(0, 0, bytBLOB, 0, bytBLOB.Length)
DR.Close()
CN.Close()
Dim FS As New System.IO.FileStream(DestFilePath, IO.FileMode.Create, IO.FileAccess.Write)
FS.Write(bytBLOB, 0, bytBLOB.Length)
FS.Close()
'trying to encode within memory... none of these work. tried many.
Debug.Print(System.Text.Encoding.Unicode.GetString(bytBLOB))
Debug.Print(System.Text.Encoding.UTF8.GetString(bytBLOB))
Debug.Print(System.Text.Encoding.UTF32.GetString(bytBLOB))
Debug.Print(System.Text.Encoding.UTF7.GetString(bytBLOB))
値: G DCドラフト/私たちは、私は新しいものをheresadgkj 2の束を追加している行くここに改訂@#2355 @^@ & &() ""」wlgkjw端 HHHHH H8 H8 HB HB HX HX H^H^ (データを含むと---> '末端が' 正しい 'ドラフト' との間。)
エンコーディングから値:は、ここに結果を置くことができないため、stackoverflowの旗中国やスパムなどの未知の文字のDataGrid(DataGridの選択変更イベント)から直接
:
Debug.Print("value " & dgSlips.SelectedCells(0).Item(dgSlips.SelectedCells(0).Column.DisplayIndex))
値からDataGrid: G
DataTableから直接 DataGridのソース:
'get recordset of selected table
OpenDB()
Dim RS As New ADODB.Recordset
RS = rsQueryTable(cbTables.Text)
'cast recordset into datatable
Dim DT As New DataTable
Dim DA As New OleDbDataAdapter()
DA.Fill(DT, RS) 'fills the data table with the recordset
'cast datagrid with datatable
dgSlips.ItemsSource = DT.DefaultView
dgSlips.DataContext = DT
Debug.Print("Value from DataTable: " & DT(2)("Description"))
CloseDB()
データテーブルから値: GཇߐC牄晡⽴敲楶敳栠牥敷朠❉摡楤杮愠戠湵档漠敮⁷瑳晵敨敲慳杤橫㈠⍀⁀ ㌲㔵䀠䁞☦⤨∢•汷歧睪攠摮AAഀ䠀䠀᠏䠁᠏Ԁ䠀ᬏԀ䠁ᬏ䠀㠏䠁㠏Ѐ䠀䈏Ѐ䠁䈏䠀堏䠁堏Ѐ䠀帏Ѐ䠁帏G