• .NET读写DBF


        C# 读写DBF分为两种模式,一种为OLEDB驱动,需要安装一个文件“VFPOLEDBSetup.msi”; 一种为Odbc模式,这种几乎上不需要安装Odbc驱动

    我这边用的是第一种。

             /// <summary>
            /// 读DBF文件到DataTable
            /// </summary>
            /// <param name="dbname">DBF实际绝对路径带文件名</param>
            /// <returns></returns>
            public static DataTable DbfToDataTable(string dbname)
            {
                try
                {
                    var conn = new OleDbConnection(string.Format(@"provider=VFPOLEDB.1;Source Type=DBF;data source={0};user id=admin;password=", dbname));
                    string table = dbname.Substring(dbname.LastIndexOf("\") + 1);
                    var da = new OleDbDataAdapter(string.Format("select * from {0}", table), conn);
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    conn.Close(); 
                    return dt;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
            /// <summary>
            /// 写DataTable文件到DBF文件中
            /// </summary>
            /// <param name="dt">DataTable数据表</param>
            /// <param name="filepath">DBF保存的绝对路径</param>
            /// <param name="savefilename">DBF文件名</param>
            /// <returns></returns>
    public static void WriteToDbf(DataTable dt, string filePath, string savefilename)
            { 
               // 连接字符串
                string sConn =
                    "Provider=Microsoft.Jet.OLEDB.4.0; " +
                    "Data Source=" + filePath + "; " +
                    "Extended Properties=dBASE IV;";
                OleDbConnection conn = new OleDbConnection(sConn);
                conn.Open();
                dt.TableName=DateTime.Now.ToString("yyyyMMddHHmmssff");
                try
                {
                    //如果存在同名文件则先删除
                    if (File.Exists(dt.TableName + ".dbf"))
                    { 
                        File.Delete(dt.TableName + ".dbf");
                    } 
                    OleDbCommand cmd;
                     
                    //建立新表
                    StringBuilder sbCreate = new StringBuilder();
                    sbCreate.Append("CREATE TABLE " + dt.TableName + ".dbf (");
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        sbCreate.Append(dt.Columns[i].ColumnName);
                        sbCreate.Append(" char(25)");
                        if (i != dt.Columns.Count - 1)
                        {
                            sbCreate.Append(", ");
                        }
                        else
                        {
                            sbCreate.Append(')');
                        }
                    } 
                    cmd = new OleDbCommand(sbCreate.ToString(), conn);
                    cmd.ExecuteNonQuery();
    
                    //插入各行
                    StringBuilder sbInsert = new StringBuilder();
                    foreach (DataRow dr in dt.Rows)
                    {
                        sbInsert.Clear();
                        sbInsert.Append("INSERT INTO " + dt.TableName + ".dbf (");
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            sbInsert.Append(dt.Columns[i].ColumnName);
                            if (i != dt.Columns.Count - 1)
                            {
                                sbInsert.Append(", ");
                            }
                        }
                        sbInsert.Append(") VALUES (");
                        for (int i = 0; i < dt.Columns.Count; i++)
                        {
                            sbInsert.Append("'" + dr[i].ToString() + "'");
                            if (i != dt.Columns.Count - 1)
                            {
                                sbInsert.Append(", ");
                            }
                        }
                        sbInsert.Append(')'); 
                        cmd = new OleDbCommand(sbInsert.ToString(), conn);
                        cmd.ExecuteNonQuery();
                    }
    
                    //替换文件名
                    if (File.Exists(filePath + "\" + DateTime.Now.ToString("yyyyMMdd") + ".DBF"))
                    {
                        File.Move(filePath + "\" + DateTime.Now.ToString("yyyyMMdd") + ".DBF", filePath + "\" + savefilename + ".DBF");
                        
                    }
    
    
                    MessageBox.Show("抄表文件下载完毕!", "【温馨提示】", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                } 
                conn.Close();
            }

    替换文件名的原因是因为保存DBF文件系统会自动生成文件名为yyyymmdd.DBF的DBF文件,改名为了实现自定义文件名。

  • 相关阅读:
    angularjs 默认选中ng-repeat的一个
    AngularJs中directive的延迟加载
    AngularJS的angucomplete-alt
    Bootstrap Multiselect中文
    input[file]标签的accept=”image/*”属性响应很慢的解决办法
    全局安装cnpm
    实现鼠标悬浮内容自动撑开的过渡动画
    table表格 css样式
    IntelliJ idea 的破解
    浏览器使用谷歌搜索
  • 原文地址:https://www.cnblogs.com/wofeiliangren/p/11282362.html
Copyright © 2020-2023  润新知