从SQL表记录创建.DBF文件

时间:2015-09-15 05:19:02

标签: c# .net dbf

我想从SQL表记录中创建一个.DBF文件。

例如,如果SQL中有一个名为CountryMaster的表,它有5列:

  1. ID int identity(1,1)
  2. 名称varchar(100)
  3. 详情varchar(200)
  4. 状态位
  5. CreatedDate datetime
  6. 它有100行。

    如何使用C#中的.DBF文件中的标题导出这些记录?

    注意:创建的.DBF文件大小必须非常紧凑。

3 个答案:

答案 0 :(得分:9)

您可以看到Xbase Data file (*.dbf)结构并编写自己的代码,但我已经完成了实施,并且已经使用了多年。您可以在GitHub

找到它

如何使用库

在名为 DbfFile.cs 的文件中有一些方法。你可以使用它们中的任何一个。我将解释其中一些:

第一次写入方法

DataTable保存为 dbf 文件:

static void Write(string fileName, System.Data.DataTable table, Encoding encoding)
  • fileName:是您希望保存.dbf输出文件的位置。
  • table:您从 SQL Server 或任何其他来源读取的数据。
  • encoding:保存字符串数据时使用的编码

第二种写入方法

List<T>保存到dbf文件中。

static void Write<T>(string fileName,
                                    List<T> values,
                                    List<Func<T, object>> mapping,
                                    List<DbfFieldDescriptor> columns,
                                    Encoding encoding)

读取数据库并将结果保存到某个类类型中,然后使用此方法将类值保存到dbf文件。以下是对其参数的描述:

  • fileName:要保存的dbf文件名
  • values:您的数据作为要保存到dbf文件中的T类型的对象列表
  • mapping:告诉此方法如何从类类型中检索数据的函数列表。
  • columns:dbf列信息
  • encoding:dbf文件的编码。

第二次写入方法的示例

由于第一种方法是直接的,我提供了第二种写法的例子。考虑您要将List<MyClass>数据保存到dbf文件中。这是代码

class MyClass
{
    public int Id {get;set;}
    public string Name {get;set;}
}

现在您可以将List<MyClass>保存到dbf文件中,如下所示:

var idColumn = DbfFieldDescriptors.GetIntegerField("Id");
var nameColumn = DbfFieldDescriptors.GetStringField("Name");
var columns = new List<DbfFieldDescriptor>() { idColumn, nameColumn };

Func<MyClass, object> mapId = myClass => myClass.Id;
Func<MyClass, object> mapName = myClass => myClass.Name;
var mapping = new List<Func<MyClass, object>>() { mapId, mapName };

List<MyClass> values = new List<MyClass>();
values.Add(new MyClass() { Id = 1, Name = "name1" });

DbfFileFormat.Write(@"C:\yourFile.dbf", values, mapping, columns, Encoding.ASCII);
  

同样使用此库,您可以读取dbf文件,而您的代码则不会   取决于Microsoft.Jet.OLEDB或其他任何内容。

享受它。

答案 1 :(得分:1)

大多数情况下,您需要的所有信息都可以在Trouble with Insert Into .dbf file看到,因为它显示了在创建.dbf文件时如何创建表并在其中插入值。您需要对指定的字段进行一些修改,但页面会描述您需要的所有内容。

答案 2 :(得分:0)

要为您提供C#解决方案,我首先要下载适用于.DBF表的Microsoft Visual Foxpro OleDb Provider

在C#代码的顶部,添加

using System.Data.SqlClient;
using System.Data.OleDb;

然后,在移动数据的方法中

    void MoveFromSQLToDBF()
    {    
        // have a table to pull down your SQL Data...
        var dataFromSQL = new DataTable();

        // However your connection to your SQL-Server
        using (var sqlConn = new  SqlConnection("YourSQLConnectionString"))
        {
           using (var sqlCmd = new SqlCommand("", sqlConn))
           {
              // Get all records from your table
              sqlCmd.CommandText = "select * from CountryMaster";
              sqlConn.Open();
              var sqlDA = new SqlDataAdapter();
              // populate into a temp C# table
              sqlDA.Fill(dataFromSQL);
              sqlConn.Close();
           }
        }

        // Now, create a connection to VFP 
        // connect to a PATH where you want the data.
        using (var vfpConn = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=C:\SomePathOnYourMachine\"))
        {
           using (var vfpCmd = new OleDbCommand("", vfpConn))
           {
              // Create table command for VFP
              vfpCmd.CommandText = "CREATE TABLE testFromSQL ( ID Numeric(18,0), [Name] Char(100) NULL, [Details] Char(200) NULL, [Status] Logical NULL, [CreateDate] DATETIME NULL)";

              vfpConn.Open();
              vfpCmd.ExecuteNonQuery();

              // Now, change the command to a SQL-Insert command, but PARAMETERIZE IT.
              // "?" is a place-holder for the data
              vfpCmd.CommandText = "insert into testFromSQL "
                 + "( ID, [Name], [Details], [Status], [CreateDate]) values ( ?, ?, ?, ?, ? )";

              // Parameters added in order of the INSERT command above.. 
              // SAMPLE values just to establish a basis of the column types
              vfpCmd.Parameters.Add( new OleDbParameter( "parmID", 10000000 ));
              vfpCmd.Parameters.Add( new OleDbParameter( "parmName", "sample string" ));
              vfpCmd.Parameters.Add(new OleDbParameter( "parmDetails", "sample string" ));
              vfpCmd.Parameters.Add(new OleDbParameter( "parmStatus", "sample string" ));
              vfpCmd.Parameters.Add( new OleDbParameter( "parmCreateDate", DateTime.Now ));

              // Now, for each row in the ORIGINAL SQL table, apply the insert to VFP
              foreach (DataRow dr in dataFromSQL.Rows)
              {
                 // set the parameters based on whatever current record is
                 vfpCmd.Parameters[0].Value = dr["ID"];
                 vfpCmd.Parameters[1].Value = dr["Name"];
                 vfpCmd.Parameters[2].Value = dr["Details"];
                 vfpCmd.Parameters[3].Value = dr["Status"];
                 vfpCmd.Parameters[4].Value = dr["CreateDate"];
                 // execute it
                 vfpCmd.ExecuteNonQuery();
              }

              // Finally, for compactness, use a VFP Script to copy to Excel (CSV) format
              using (var vfpCmd2 = new OleDbCommand("", vfpConn))
              {
                 vfpCmd2.CommandType = CommandType.StoredProcedure;
                 vfpCmd2.CommandText = "ExecScript";

                 vfpCmd2.Parameters.Add(new OleDbParameter( "csvScript", 
@"Use testFromSQL
copy to YourCompactFile.csv type csv
use" ));

                 vfpCmd2.ExecuteNonQuery();
              }

              // close VFP connection
              vfpConn.Close();

           }
        }
    }

由于OleDb不支持复制TYPE CSV,我找到了this post on S/O to dump into CSV format