c#

位置:IT落伍者 >> c# >> 浏览文章

使用C#读取dbf行情文件


发布日期:2022年03月05日
 
使用C#读取dbf行情文件

由于历史的原因我国的上交所和深交所使用的还是dbf文件来进行行情数据的分发关于卫星报盘系统可以参考 这个博客中关于证券公司信息化的文章写的还是相当不错的上交所使用的是showdbf文件而深交所使用的是SJSHQDBF这种文件可以使用Visual FoxPro直接打开查看其内容接下来说说怎么使用C#读取其中的数据

使用C#读取dbf文件推荐使用OLE DB来读取(微软官方都不推荐使用ODBC来读)首先需要下载安装Microsoft OLE DB Provider for Visual FoxPro 接下来就可以使用C#操作OLE DB连接字符串为

Provider=vfpoledb;Data Source=C:\vfp;Collating Sequence=machine;

这里C:\vfp是一个文件夹路径要读取的dbf文件就在这个文件夹下面当然如果dbf是在网络共享位置那么也可以使用网络文件夹的路径如果要读取深交所行情的所有数据返回一个DataSet那么对应的函数为

public static DataSet ReadSJSHQ()

{

string strConn = @Provider=vfpoledb;Data Source=C:\vfp;Collating Sequence=machine;;

using (OleDbConnection myConnection = new OleDbConnection(strConn))

{

OleDbDataAdapter adpt = new OleDbDataAdapter(select * from SJSHQDBF myConnection);

DataSet mySet = new DataSet();

adptFill(mySet);

myConnectionClose();

return mySet;

}

}

这个函数就可以把所有深交所的数据读取出来如果要读取上交所的数据那么就不会这么简单了虽然使用这个方法把查询改成select * from showdbf也能读取返回一个数据集但是这个返回的数据集是不完整的前面大约多行数据没有读取出来如果使用Visual FoxPro打开showdbf文件可以查看到所有的数据内容之所以没有返回前多行的原因是因为dbf文件中将这些行置为删除状态了所以如果要读取所有的数据行那么需要设置当前读取的命令去掉删除标记比如要读取上交所dbf文件中的所有S那么对应的代码应该是

public static DataSet ReadShowS()

{

string strConn = @Provider=vfpoledb;Data Source=C:\vfp;Collating Sequence=machine;;

using (OleDbConnection myConnection = new OleDbConnection(strConn))

{

myConnectionOpen();

OleDbCommand cmd = new OleDbCommand();

cmdConnection = myConnection;

cmdCommandText = SET DELETED OFF;//去掉删除标记拿到所有记录

cmdCommandType = CommandTypeText;

cmdExecuteNonQuery();

OleDbDataAdapter adpt = new OleDbDataAdapter(select s from showdbf myConnection);

DataSet mySet = new DataSet();

adptFill(mySet);

myConnectionClose();

return mySet;

}

}

如果我们要获取show里面的所有行所有列的数据那么使用sql命令select * from showdbf是会抛出异常

提供程序无法确定 Decimal 值例如该行刚刚创建未提供 Decimal 列的默认值并且使用者尚未设置新 Decimal 值

而在不读取有删除标记的行时是不会报错的这是因为前面的行中有些列值的问题用Visual Foxpro打开showdbf文件可以看到第一行S的数据行其S列是当前dbf文件数据生成的日期比如我现在的S值为这一列的数据定义是数值型宽度小数位数据说是设计上的Bug参见于是我们如果要正常读取这个表的话需要对第一行做特别处理其实本来第一行就需要特殊处理的因为第一行并不是实际的数据第一行主要是说明这个文件产生的日期时间之类的所有我使用的就是简单粗暴的方法使用个DataSet来返回这些数据具体函数代码为

public static DataSet ReadShow(DataSet mySet)

{

string strConn = @Provider=vfpoledb;Data Source=C:\vfp;Collating Sequence=machine;;

using (OleDbConnection myConnection = new OleDbConnection(strConn))

{

myConnectionOpen();

OleDbCommand cmd = new OleDbCommand();

cmdConnection = myConnection;

cmdCommandText = SET DELETED OFF;//去掉删除标记拿到所有记录

cmdCommandType = CommandTypeText;

cmdExecuteNonQuery();

//单独读取第一行

OleDbDataAdapter adpt = new OleDbDataAdapter(SELECT sssssstr(s) as sssss from show where s=\\ myConnection);//只有这几个字段有值

adptFill(mySet);

//接下来读取其他行

OleDbDataAdapter adpt = new OleDbDataAdapter(SELECT * from show where s<>\\ myConnection);

DataSet mySet = new DataSet();

adptFill(mySet);

myConnectionClose();

return mySet;

}

}

至此我们已经将深交所和上交所的行情文件都读取出来了接下来就是做其他逻辑处理~~~~~~

上一篇:展现C#世界之三:第一个C#应用程序

下一篇:C#读写ini配置文件