原创:一段利用C#2005操作FOXPRO表的函数

由于工作需要,需要将一些数据保存到规定结构的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);
        }

posted @ 2008-01-13 13:54  drsniper  阅读(672)  评论(0编辑  收藏  举报