2011-02-08 42 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(); 
    }