DBF文件的备注字段仅使用VFP OLE DB提供程序(.NET)返回几个字符

时间:2019-06-14 22:15:17

标签: c# .net oledb visual-foxpro dbase

我正在开发一个Winforms应用,该应用从.DBF数据库中读取信息。 我使用VFP OLE DB Provider进行常规查询,效果很好。

但是到了我需要读取存储在Memo字段中的图像的地步。如果我执行常规的SELECT查询来获取字段,那么我只会得到一个值为

的字符串
  

ÿØÿà

我相信这是JPE图像的元数据的一部分,但显然我缺少一些信息。

我需要做的是从数据库中提取信息,并以PictureBox的形式显示。

这是我用来从数据库读取信息的代码:

public DataTable SendQuery(string query)
{
    try
    {
        Conn = new OleDbConnection
        {
            ConnectionString = "Provider=vfpoledb;Data Source=C:\Data;Extended Properties=dBASE IV;Collating Sequence=machine;"
        };
        Conn.Open();

        OleDbDataAdapter adapter = new OleDbDataAdapter(query, Conn);
        DataSet ds = new DataSet();
        adapter.Fill(ds);
        Conn.Close();
        return ds.Tables[0];
    }
    catch (OleDbException e)
    {
        MessageBox.Show(e.Message + "\nWith error" + e.ErrorCode, "Error de base de datos");
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message, "Error general");
    }
    finally
    {
        Conn.Close(); //Just to be sure
    }
    return null;
}

正如我之前提到的,这在阅读文本和数字(甚至是存储大文本的备注字段)时也能很好地工作,但它不适用于“备注”字段中的该特定图像。

仅作说明,我确定数据库或字段均未损坏。

1 个答案:

答案 0 :(得分:1)

默认情况下,备注字段被OleDb视为字符串。但是,在C#中,与文档不同,字符串是ASCIIZ字符串。过去看不到\ x00字符了。您可以将字段强制转换为Blob,从而将其读取为二进制值。这是一个示例:

用于创建示例数据的VFP代码:

CREATE TABLE c:\temp\imageData FREE (id i, ext c(3), filedata m)
INSERT INTO c:\temp\imageData (id, ext, filedata) VALUES (1,'jpg',FILETOSTR('C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\arm64\AccChecker\AccChecker_HelpFiles\image001.jpg'))
INSERT INTO c:\temp\imageData (id, ext, filedata) VALUES (2,'jpg',FILETOSTR('C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\arm64\AccChecker\AccChecker_HelpFiles\image002.jpg'))
INSERT INTO c:\temp\imageData (id, ext, filedata) VALUES (3,'jpg',FILETOSTR('C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\arm64\AccChecker\AccChecker_HelpFiles\image003.jpg'))

要从VFP读取的代码:

void Main()
{
    var table = SendQuery("select id, ext, cast(filedata as blob) as filedata from imageData");

    foreach (DataRow row in table.Rows)
    {
        var bytes = (byte[])row["filedata"];
        var id = (int)row["id"];
        var ext = (string)row["ext"];

        File.WriteAllBytes(Path.Combine(@"c:\temp", $"test_image{id}.{ext.Trim()}"),bytes);
    }
}

public DataTable SendQuery(string query)
{
    string cnStr = @"Provider=vfpoledb;Data Source=C:\Temp;";
    try
    {
        DataTable tbl = new DataTable();
        new OleDbDataAdapter(query, cnStr).Fill(tbl);
        return tbl;
    }
    catch (OleDbException e)
    {
        MessageBox.Show(e.Message + "\nWith error" + e.ErrorCode, "Error de base de datos");
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message, "Error general");
    }
    return null;
}

PS:您可能曾经使用过Linq,因此不会遇到这样的问题(Tom Brothers拥有VFP驱动程序-Linq To VFP)。