C# - 数据备份-datatable数据写入到CSV文件中
2016-06-07 15:21
405 查看
今天是2016年6月7日,一个特殊的日子,2012年的今天我也在考场上奋笔疾书。大二那年,王老师曾经建议我们开通个博客记录一下你们的学习历程,但是那会没有领会老师的意思,觉得写博客没什么大不了的,而且一直说写,但是最后也没有开始。今天,是我上班的第二十天,其实从上班的第一天我就想着写博客,但是又不知从何写起。这二十天来,做了一些东西,在做的过程中,在网上找了好多资料,但是都不完整,所以,我就想着从今天开始记录一下我完成的功能,梳理一下自己的思路,提高一下自己的书写能力。
开发工具:Visual Studio 2012
数据库:access 2007
界面如下图所示
![](https://img-blog.csdn.net/20160607163405069)
这个页面是由一个datagridview控件、四个button控件以及一个groupbox控件组成。datagridview控件是重点,用来编辑和显示数据。
整体流程:
查询出数据库中的所有表名,并在datagridview中显示出来
根据选择的表名查询表中的数据
生成csv文件
选择备份的路径
备份数据
在查询表名的过程中,遇到了问题。这条sql语句在Access 2007中执行的结果是正确的。但是在Visual Studio 2012 中执行就遇到了问题,错误信息大概就是:没有相关权限。忘记截图了。只能去Access2007中中给当前用户设置权限。
基于上一个方法有点麻烦,我又找到了另一种方法:
OleDbConnection的GetSchema方法用来获取数据库的结构,所以也可以用它获取数据库中所有的表
但是,用getSchema()方法得到的数据库中TABLE_TYPE的类型有好多种:Table、view、system table、access table。我只用table,所以要使用dataview的rowfilter()方法过滤一下。
查询出表名以及对datatable进行过滤
将datatable中的数据 导出到csv文件中
CsvHelper—C#关于CSV文件的导入和导出以及转化:出自http://www.sufeinet.com/thread-1707-1-1.html
开发工具:Visual Studio 2012
数据库:access 2007
界面如下图所示
这个页面是由一个datagridview控件、四个button控件以及一个groupbox控件组成。datagridview控件是重点,用来编辑和显示数据。
整体流程:
查询出数据库中的所有表名,并在datagridview中显示出来
根据选择的表名查询表中的数据
生成csv文件
选择备份的路径
备份数据
从数据库中查询出表名
我的Sql语句是这样写的:SELECT name FROM MSysObjects WHERE type=1 AND flags=0;
在查询表名的过程中,遇到了问题。这条sql语句在Access 2007中执行的结果是正确的。但是在Visual Studio 2012 中执行就遇到了问题,错误信息大概就是:没有相关权限。忘记截图了。只能去Access2007中中给当前用户设置权限。
基于上一个方法有点麻烦,我又找到了另一种方法:
OleDbConnection的GetSchema方法用来获取数据库的结构,所以也可以用它获取数据库中所有的表
但是,用getSchema()方法得到的数据库中TABLE_TYPE的类型有好多种:Table、view、system table、access table。我只用table,所以要使用dataview的rowfilter()方法过滤一下。
查询出表名以及对datatable进行过滤
string ConnStr = ConfigurationManager.AppSettings["ConnectionString"]; OleDbConnection Conn = new OleDbConnection(ConnStr); try { if (Conn.State == ConnectionState.Closed) { Conn.Open(); } DataTable dt = Conn.GetSchema("Tables"); DataView dv = dt.DefaultView; dv.RowFilter = "TABLE_TYPE = 'TABLE'"; DataTable newdt = dv.ToTable(); } catch(Exception e) { MessageBox.Show(e.ToString()); } finally { if (Conn.State == ConnectionState.Open) { Conn.Close(); Conn.Dispose(); } } grdWork.AutoGenerateColumns = false; grdWork.Rows.Clear(); grdWork.DataSource = newdt;
//保存数据 private void btnSave_Click(object sender, EventArgs e) { for (int i = 0; i < grdWork.Rows.Count; i++) { 判断单选按钮是否为空,(checkbox默认为空,所以要判断) if (grdWork.Rows[i].Cells["choose"].Value != null) {//判断单选按钮是否选中,如果选中,取得tableName列的值即表名 if (Convert.ToBoolean(grdWork.Rows[i].Cells["choose"].Value.ToString())) { strTable = grdWork.Rows[i].Cells["TableName"].Value.ToString(); //根据表名查询对应表的数据 DataTable dt = GetbackUpData(strTable); //将datatable中的数据备份为csv文件 backUpToCsv(dt); } } } }
//根据表名查询出表中的数据 private DataTable GetbackUpData(string tableName) { string strSql = " Select * From " + tableName + ""; DataTable table = comdb.Adapter(strSql); return table; }
//get datatable columnname public static string GetColumnsByDataTable(DataTable dt) { string strColumns = null; if (dt.Columns.Count > 0) { int columnNum = 0; columnNum = dt.Columns.Count; for (int i = 0; i < dt.Columns.Count; i++) { if (i == 0) { strColumns = dt.Columns[i].ColumnName; } else { strColumns += "," + dt.Columns[i].ColumnName; } } } return strColumns; }
//数 4000 据备份为csv文件 private void backUpToCsv(DataTable dt) { SaveFileDialog savefile = new SaveFileDialog(); //打开文件的初始目录 savefile.InitialDirectory = @"C:\Documents and Settings\Administrator\桌面"; //格式转换 savefile.Filter ="数据库文件(*.csv)|"; //设置或获取文件后缀 savefile.FileName = strTable+"-"+ System.DateTime.Now.ToString("yyyyMMdd"); //设置文件格式 savefile.DefaultExt = ".csv"; //提示用户选择保存文件 DialogResult dr = savefile.ShowDialog(); if (dr == DialogResult.OK) { String filePath = savefile.FileName.ToString(); try { string columnName= GetColumnsByDataTable(dt); //在这个方法中依次传入datatable、文件路径、表的列名 CsvHelper.DataTableToCsv(dt, filePath, columnName); MessageBox.Show("数据备份成功"); this.Close(); } catch (Exception e) { MessageBox.Show(e.ToString()); } } }
将datatable中的数据 导出到csv文件中
using System.Data; using System.IO; namespace CsvUtilities { /// <summary> /// CSV文件转换类 /// </summary> public static class CsvHelper { /// <summary> /// 导出报表为Csv /// </summary> /// <param name="dt">DataTable</param> /// <param name="strFilePath">物理路径</param> /// <param name="tableheader">表头</param> /// <param name="columname">字段标题,逗号分隔</param> public static bool DataTableToCsv(DataTable dt, string strFilePath, string columname) //public static bool DataTableToCsv(DataTable dt, string strFilePath, string tableheader, string columname) { try { string strBufferLine = ""; StreamWriter strmWriterObj = new StreamWriter(strFilePath, false, System.Text.Encoding.UTF8); //strmWriterObj.WriteLine(tableheader); strmWriterObj.WriteLine(columname); for (int i = 0; i < dt.Rows.Count; i++) { strBufferLine = ""; for (int j = 0; j < dt.Columns.Count; j++) { if (j > 0) strBufferLine += ","; strBufferLine += dt.Rows[i][j].ToString(); } strmWriterObj.WriteLine(strBufferLine); } strmWriterObj.Close(); return true; } catch { return false; } } /// <summary> /// 将Csv读入DataTable /// </summary> /// <param name="filePath">csv文件路径</param> /// <param name="n">表示第n行是字段title,第n+1行是记录开始</param> public static DataTable CsvToDataTable(string filePath, int n, DataTable dt) { StreamReader reader = new StreamReader(filePath, System.Text.Encoding.UTF8, false); int i = 0, m = 0; reader.Peek(); while (reader.Peek() > 0) { m = m + 1; string str = reader.ReadLine(); if (m >= n + 1) { string[] split = str.Split(','); System.Data.DataRow dr = dt.NewRow(); for (i = 0; i < split.Length; i++) { dr[i] = split[i]; } dt.Rows.Add(dr); } } return dt; } } }
CsvHelper—C#关于CSV文件的导入和导出以及转化:出自http://www.sufeinet.com/thread-1707-1-1.html
相关文章推荐
- C#实现Datatable排序的方法
- C#从DataTable获取数据的方法
- C#实现DataTable映射成Model的方法(附源码)
- C# DataTable使用方法详解
- C#实现从多列的DataTable里取需要的几列
- c# 如何将RadioButton与DataTable数据进行绑定
- C#实现DataTable转换成IList的方法
- C#使用DataSet Datatable更新数据库的三种实现方法
- C# DataTable的详细用法分享
- C#保存与读取DataTable信息到XML格式的方法
- C#中DataTable排序、检索、合并等操作实例
- C#中datatable序列化与反序列化实例分析
- 在ASP.NET 2.0中操作数据之六十八:为DataTable添加额外的列
- C#在DataTable中根据条件删除某一行的实现方法
- C#中DataTable删除行的方法分析
- C# datatable 不能通过已删除的行访问该行的信息处理方法
- C#编程实现DataTable添加行的方法
- DataSet与DataTable的区别示例介绍
- C#获取变更过的DataTable记录的实现方法
- asp.net实现数据从DataTable导入到Excel文件并创建表的方法