原创:一段利用C#2005操作FOXPRO表的函数
首先,拷贝标准库(空库)到指定的要导出的文件夹,然后读取这个拷贝后的文件到dt1,通过循环把dt的数据添加到dt1中,更新dt1。方法笨了一点,有谁有好的建议,可以提一提!
下面是函数代码:
//五个参数,dt是含有需要导出数据的DataTable,strExportPath是导出路径,strExportFile是导出文件名,要带有.dbf的后缀,strStructFile是标准库的文件名,含有路径,prgBar是用来在界面上显示导出进度的。
public static void dbfExport(System.Data.DataTable dt, string strExportPath, string strExportFile, string strStructFile,System.Windows.Forms.ProgressBar prgBar)
{
//第一步:拷贝标准库
System.IO.File.Copy(strStructFile, strExportPath + @"\" + strExportFile, true);
//建立连接,读取拷贝过去的那个库,注意连接字符串,使用的是vfp9.0的driver,微软网站上有下载
System.Data.OleDb.OleDbConnection conn1 = new System.Data.OleDb.OleDbConnection();
conn1.ConnectionString = @"Provider=VFPOLEDB.1;DATA Source=" + strExportPath + @"\" +strExportFile + ";";
string strSQL = "SELECT * FROM " + strExportFile;
System.Data.OleDb.OleDbDataAdapter adp = new System.Data.OleDb.OleDbDataAdapter(strSQL, conn1);
System.Data.DataTable dt1 = new DataTable();
adp.Fill(dt1);
//初始化进度条
prgBar.Value = 0;
prgBar.Maximum = dt.Rows.Count;
//循环读取dt的数据添加到dt1,注意方法,还有一个就是null值的处理,具体要根据你的dbf库结构来设定。
//我的dbf库主要就是两种字段,一种是字符型,一种是整型
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow dr = dt1.NewRow();
for (int j = 0; j < dt.Columns.Count; j++)
{
//下面这段代码我做点解释,对于dr[j]的赋值,首先判断dt.Rows[i][dt1.Colums[j].ColumnName.ToString()]的值是否为null,
//如果是null,则赋值为DBNull.Value;如果不是null,则插入原始值dt.Rows[i][dt1.Colums[j].ColumnName.ToString()]
//直接赋值null是不可以的,null主要用于对象类的数据,DataTable数据库中的null应该用DBNull.Value来代替
dr[j] = dt.Rows[i][dt1.Columns[j].ColumnName.ToString()] == null ? DBNull.Value : dt.Rows[i][dt1.Columns[j].ColumnName.ToString()];
}
dt1.Rows.Add(dr);
prgBar.Value++;
}
//初始化一个CommandBuilder,目的是使得adp的更新操作初始化
System.Data.OleDb.OleDbCommandBuilder cmdBld = new System.Data.OleDb.OleDbCommandBuilder(adp);
//更新dt1,系统自动将数据添加到dbf库中
adp.Update(dt1);
}