今天是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