您的位置:首页 > 编程语言 > C#

C# - 数据备份-datatable数据写入到CSV文件中

2016-06-07 15:21 405 查看
今天是2016年6月7日,一个特殊的日子,2012年的今天我也在考场上奋笔疾书。大二那年,王老师曾经建议我们开通个博客记录一下你们的学习历程,但是那会没有领会老师的意思,觉得写博客没什么大不了的,而且一直说写,但是最后也没有开始。今天,是我上班的第二十天,其实从上班的第一天我就想着写博客,但是又不知从何写起。这二十天来,做了一些东西,在做的过程中,在网上找了好多资料,但是都不完整,所以,我就想着从今天开始记录一下我完成的功能,梳理一下自己的思路,提高一下自己的书写能力。

开发工具: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  datatable