DBF格式的数据库是老的数据库,用foxpro可以打开,社会上那些牛逼的软件也可以打开。当然微软的一些软件也可以打开。
但是如果我们用C#开发的话,需要先安装一个VFPOLEDBSetup.msi,这个微软官网上就有下的,网上一搜好多。
可能需要引入两个库
using System.Data;
using System.Data.OleDb;
然后开始码代码;
最简单的代码
public static DataSet ReadSJSHQ()
{
try
{
string strConn = @"Provider=vfpoledb;Data Source=<pdf文件地址> ;Collating Sequence=machine;";
using (OleDbConnection myConnection = new OleDbConnection(strConn))
{
OleDbDataAdapter adpt = new OleDbDataAdapter("select * from <pdf文件名>.dbf", myConnection);
DataSet mySet = new DataSet();
adpt.Fill(mySet);
myConnection.Close();
return mySet;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return null;
}
}
这样文件就会读到myset里面。
但是会经常报这样一种错误:程序无法确定Decimal值。例如,该行刚刚创建,未提供Decimal列的默认值,并且使用者尚未设置新的Decimal值。
这是因为那就是有的列是decimal或者float,但是有没有值,所以需要特殊处理,至于怎么处理,看情况而定,像我这个直接不要那一列。
public static DataSet ReadDBF()
{
DataSet mySet0 = new DataSet();
string strConn = @"Provider=vfpoledb;Data Source=dbf文件地址;Collating Sequence=machine;";
using (OleDbConnection myConnection = new OleDbConnection(strConn))
{
myConnection.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = myConnection;
cmd.CommandText = "SET DELETED OFF";//去掉删除标记,拿到所有记录
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
//单独读取第一行 ,,如果报错提供程序无法确定Decimal值。例如,该行刚刚创建,未提供Decimal列的默认值,并且使用者尚未设置新的Decimal值.”
//那就是有的列是decimal或者float,但是有没有值,所以需要
OleDbDataAdapter adpt0 = new OleDbDataAdapter("SELECT name as name,category as category,subctgry as subctgry from dbf文件名", myConnection);//只有这几个字段有值
adpt0.Fill(mySet0);
myConnection.Close();
return null;
}
}