从VB.NET中读取Paradox中的BLOB字段

时间:2016-08-08 21:27:47

标签: vb.net blob connection-string paradox

目标:使用VB.NET从Paradox数据库中读取BLOB字段。

到目前为止我能做到的事情:

  • 连接到数据库并更改(非BLOB)值。太好了!*

  • 将整个表格(包括BLOB字段)读入DataGrid(通过OledbDataAdapter.Fill读入DataTable用作ItemsSource)但是...... blob字段中包含大量垃圾字符。

*我的连接字符串通过Windows 10中的ODBC数据源管理员引用用户DSN(在下面的代码中命名为ABADB)到目前为止,我似乎太笨了,无法创建一个不依赖于DSN。欢迎任何提示。

什么似乎不起作用:

  • 在查询表达式'CONVERT(说明使用utf8)'中使用CONVERT SQL命令(此错误:[Microsoft] [ODBC Paradox Driver]语法错误(缺少运算符)。)
  • 来自OledbDataReader.GetBytes 的FileStream.Write流(这适用于某些blob字段但不是全部,并且包含与DataGrid中显示的垃圾字符不同的垃圾字符。令人困惑的是为什么只有一些BLOB字段被解释正确。)

  • 使用System.Text.Encoding 编码的Debug.Print字节(为所有BLOB值提供垃圾字符 - 尽管使用与FileStream.Write相同的字节流,偶尔会提供可读值)

  • Debug.Print直接从DataGrid 打印BLOB值(奇怪的是,我只得到字符G - 注意DataGrid本身正确读取BLOB字段并在之前和之后添加垃圾字符)

  • Debug.Print直接来自DataTable的BLOB值,用作DataGrid 的ItemsSource(与上面相同的问题 - 它只是读出G)

下一步是什么? 我对Excel / Office中的VBA很有经验,但对VB.NET没有经验,所以我可能会对下面的代码做一些愚蠢的事情。我尝试过OledbDataReader.GetChars但还没有成功。我还简要介绍了其他要使用的库/工具。

欢迎任何智慧!

成功填充的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:

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

来自TXT文件的价值:GÐc草稿/修改我们去了我正在添加一堆新东西heresadgkj 2 @#@ 2355 @ ^ @&&()“”“ wlgkjw结束  H H H H H H8 H8 HB HB HX HX H ^ H ^ ('Draft'--->'end'之间和之间的数据是正确的。)

来自编码的值:无法在此处显示结果,因为stackoverflow将中文和未知字符标记为垃圾邮件

直接来自DataGrid (DataGrid选择更改事件):

    Debug.Print("value " & dgSlips.SelectedCells(0).Item(dgSlips.SelectedCells(0).Column.DisplayIndex))

来自DataGrid的值: G

直接来自DataTable ,用作DataGrid的ItemsSource:

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

来自DataTable的价值: Gཇߐ牄⽴⽴楶敳栠⁥⁥朠朠漠漠漠漠漠漠漠漠漠漠漠漠漠漠漠漠漠杤杤杤杤杤杤杤杤杤⁀㌲㔵䀠䁞☦⤨∢•汷歧睪攠摮AAഀ䠀؀䠀᠏؀䠁᠏Ԁ䠀ᬏԀ䠁ᬏ؀䠀㠏؀䠁㠏Ѐ䠀䈏Ѐ䠁䈏؀䠀堏؀䠁堏Ѐ䠀帏Ѐ䠁帏؀ģ؀< / p>

1 个答案:

答案 0 :(得分:0)

我假设解码整个字节串(其中只有一部分用某种文本编码编码,如ASCII或UTF8)会对非文本编码字节产生乱码,然后为文本编码字节产生文本。我错了。

解决方案是仅将文本编码的字节传递给解码方法。

希望这有助于某人!