我正在开发一个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;
}
正如我之前提到的,这在阅读文本和数字(甚至是存储大文本的备注字段)时也能很好地工作,但它不适用于“备注”字段中的该特定图像。
仅作说明,我确定数据库或字段均未损坏。
答案 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)。