zoukankan      html  css  js  c++  java
  • .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文件,改名为了实现自定义文件名。

  • 相关阅读:
    [BZOJ3884] 上帝与集合的正确用法
    [BZOJ3518] 点组计数
    [BZOJ3601] 一个人的数论
    [BZOJ3529] [Sdoi2014]数表
    原生js实现无缝滚动轮播图-点击页码即刻显示该页码的内容
    原生js实现无缝滚动轮播图
    vue封装tinymce富文本组件,图片上传回调方法
    vue-cli项目结合Element-ui基于cropper.js封装vue图片裁剪组件
    js实现多文件上传(二)-- 拖拽上传
    js实现多文件上传(一)-- 图片转base64回显
  • 原文地址:https://www.cnblogs.com/wofeiliangren/p/11282362.html
Copyright © 2011-2022 走看看