熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用C#讀取dbf行情文件

2013-11-13 10:23:08  來源: .NET編程 

  由於歷史的原因我國的上交所和深交所使用的還是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;

  }

  }

  至此我們已經將深交所和上交所的行情文件都讀取出來了接下來就是做其他邏輯處理~~~~~~


From:http://tw.wingwit.com/Article/program/net/201311/13446.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.