2011-02-08 43 views
9

我想在我的程序中從頭開始編寫一個DBF文件。我想創建它,添加一些列,然後將數據添加到X列的次數。我的程序不需要再次讀取,但其他程序會。如何在C#中從頭開始創建DBF文件?

我環顧四周尋找解決方案,但似乎都假設現有的DBF文件,而我想做一個新的。

這樣做的目的是使DBF成爲ESRI ShapeFile的一部分。

有誰知道如何做到這一點?

+0

我看到的唯一選擇是直接使用vfpoledb提供程序發出「create table」命令。這很麻煩,但它可能工作。 – alex 2011-02-08 11:58:03

+0

我剛剛發現你需要一個** dBase IV **格式的DBF文件,所以我編輯了我的答案。嘗試一下,它應該與地理信息系統(不知道如果你打開它與MS Access,雖然)。 – 2011-02-09 08:08:35

回答

9

下載Microsoft OLE DB Provider for Visual FoxPro 9.0及用途:

string connectionString = @"Provider=VFPOLEDB.1;Data Source=D:\temp"; 
using (OleDbConnection connection = new OleDbConnection(connectionString)) 
using (OleDbCommand command = connection.CreateCommand()) 
{ 
    connection.Open(); 

    OleDbParameter script = new OleDbParameter("script", @"CREATE TABLE Test (Id I, Changed D, Name C(100))"); 

    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "ExecScript"; 
    command.Parameters.Add(script); 
    command.ExecuteNonQuery(); 
} 

編輯:該OP不希望一個FoxPro DBF格式,但的dBase IV格式:

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp;Extended Properties=dBase IV"; 

using (OleDbConnection connection = new OleDbConnection(connectionString)) 
using (OleDbCommand command = connection.CreateCommand()) 
{ 
    connection.Open(); 

    command.CommandText = "CREATE TABLE Test (Id Integer, Changed Double, Name Text)"; 
    command.ExecuteNonQuery(); 
} 
1

如果你想完全消除外部依賴,你將不得不求助於手動創建文件。爲了做到這一點,您需要在描述文件格式規範的白皮書中花費一些質量時間來理解您需要實施的領域以及它們應包含的內容。你可以在這裏找到:http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

當然,這不是真正的心靈承諾。在開始旅程之前,確保你理解這裏所要做的工作。

+0

-1:實際上有對它的支持。 – 2011-02-08 11:48:39

2

我對ESRI ShapeFile一無所知......但是您可以使用OleDb創建一個dbf。

下面是使用VFP OLEDB提供一個例子:

string dbfDirectory = @"c:\"; 
    string connectionString = "Provider=VFPOLEDB;Data Source=" + dbfDirectory; 
    using (OleDbConnection connection = new OleDbConnection(connectionString)) { 
     connection.Open(); 
     OleDbCommand command = connection.CreateCommand(); 

     command.CommandText = "create table Customer(CustId int, CustName v(250))"; 
     command.ExecuteNonQuery(); 
     connection.Close(); 
    }