DBF

C#封装DataTable到DBF

2017-08-09  本文已影响0人  新手村的0级玩家
封装的过程

前言

之前讨论过
C#封装DBF文件到DataTable

那么今天反其道而行之,看一下如何将DataTable“封装”到DBF中(即生成一个DBF文件)

1.步骤描述

封装的过程

1.1 获取字段的信息

DataTable里面只有字段的名称,没有字段的长度
因此,必须有相应的模板文件来确定字段的长度

根据模板文件,获取每个字段的数据类型以及字段长度,进而确定最终DBF文件各字段的详情

1.2遍历每条数进行封装

在确定了DBF字段详情后,只需DataTable中对应字段的数据进行赋值即可

2.代码实现

         /// <summary>
        /// 创建人:Stone6762
        /// 创建时间:2017年3月10日18:12:30
        /// 功能描述:将DataTable里的数据封装到DBF中去
        /// </summary>
        /// <param name="initHeader">DBF模板列</param>
        /// <param name="fileName">目标DBF文件路径</param>
        /// <param name="dt">要封装的数据</param>
        /// 特别注意:因为不能确定同名文件是否满足模板,如果已经存在该文件,会将覆盖,不追加
        public static void DataTableToDbf(string initFile, string fileName, DataTable dt)
        {
            try
            {
                //获取一个DBF文件对象
                DbfFile dbf = new DbfFile(Encoding.Default);
                dbf.Open(initFile, FileMode.OpenOrCreate);
                DbfHeader initHeader = dbf.Header;
                //如果文件存在,那么需要删除文件
                if (File.Exists(fileName))
                {
                    File.Delete(fileName);
                }
                dbf.Open(fileName, FileMode.OpenOrCreate);
                //创建DBF文件的结构(列名)
                dbf.Header.Unlock();
                for (int i = 0; i < initHeader.ColumnCount; i++)
                {
                    DbfColumn initC = initHeader[i];
                    dbf.Header.AddColumn(initC);
                }
                //读取DataTable写入到DBF文件里
                foreach (DataRow dr in dt.Rows)
                {
                    //将DataRow里的数据封装到DbfRecord里面
                    DbfRecord record = new DbfRecord(dbf.Header);
                    foreach (DataColumn dc in dt.Columns)
                    {
                        try
                        {
                            record[dc.ColumnName] = dr[dc.ColumnName].ToString();
                        }
                        catch
                        {
                            continue;
                        }
                    }
                    dbf.Write(record, true);
                }
                //一定要Close才会把数据完全写入到DBF文件中。
                dbf.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
上一篇下一篇

猜你喜欢

热点阅读