我想从SQL表记录中创建一个.DBF
文件。
例如,如果SQL中有一个名为CountryMaster
的表,它有5列:
它有100行。
如何使用C#中的.DBF
文件中的标题导出这些记录?
注意:创建的.DBF
文件大小必须非常紧凑。
答案 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