2016-08-08 14 views
1

目的: 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の写真やコードスニペット: enter image description here

しようとすると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 ؀

答えて

0

私はバイトの全体の文字列をデコードすることを想定していましたが(そのうちの一部だけがASCIIやUTF8のような何らかのテキストエンコーディングでエンコードされています)、非テキストのエンコードされたバイトに対してぎこちないテキストをエンコードしたバイトのテキスト。私は間違っていた。

解決策は、テキストエンコードされたバイトだけをデコードメソッドに渡すことです。

これが誰かを助けることを願っています!

関連する問題