如何在Asp.net中备份Access数据库?
public void Create( string mdbPath )
{
if( File.Exists(mdbPath) ) //检查数据库是否已存在
{
throw new Exception( "目标数据库已存在,无法创建 ");
}
// 可以加上密码,这样创建后的数据库必须输入密码后才能打开
mdbPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + mdbPath;
// 创建一个CatalogClass对象的实例,
ADOX.CatalogClass cat = new ADOX.CatalogClass();
// 使用CatalogClass对象的Create方法创建ACCESS数据库
cat.Create(mdbPath);
}
///压缩修复ACCESS数据库,mdbPath为数据库绝对路径
public void Compact( string mdbPath )
{
if( !File.Exists(mdbPath) ) //检查数据库是否已存在
{
throw new Exception( "目标数据库不存在,无法压缩 ");
}
//声明临时数据库的名称
string temp = DateTime.Now.Year.ToString();
temp += DateTime.Now.Month.ToString();
temp += DateTime.Now.Day.ToString();
temp += DateTime.Now.Hour.ToString();
temp += DateTime.Now.Minute.ToString();
temp += DateTime.Now.Second.ToString() + ".bak ";
temp = mdbPath.Substring(0, mdbPath.LastIndexOf( "\\ ")+1) + temp;
//定义临时数据库的连接字符串
string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + temp;
//定义目标数据库的连接字符串
string mdbPath2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + mdbPath;
//创建一个JetEngineClass对象的实例
JRO.JetEngineClass jt = new JRO.JetEngineClass();
//使用JetEngineClass对象的CompactDatabase方法压缩修复数据库
jt.CompactDatabase( mdbPath2, temp2 );
//拷贝临时数据库到目标数据库(覆盖)
File.Copy( temp, mdbPath, true );
//最后删除临时数据库
File.Delete( temp );
}
/// 备份数据库,mdb1,源数据库绝对路径; mdb2: 目标数据库绝对路径
public void Backup( string mdb1, string mdb2 )
{
if( !File.Exists(mdb1) )
{
throw new Exception( "源数据库不存在 ");
}
try
{
File.Copy( mdb1, mdb2, true );
}
catch( IOException ixp )
{
throw new Exception(ixp.ToString());
}
}
///恢复数据库,mdb1为备份数据库绝对路径,mdb2为当前数据库绝对路径
public void Recover( string mdb1, string mdb2 )
{
if( !File.Exists(mdb1) )
{
throw new Exception( "备份数据库不存在 ");
}
try
{
File.Copy( mdb1, mdb2, true );
}
catch( IOException ixp )
{
throw new Exception(ixp.ToString());
}
}
============================================================================================================
使用ADOX创建Access数据库和表
using System;
using ADOX;
namespace WebPortal
{
/// <summary>
/// CreateAccessDB 的摘要说明。
/// 对于不同版本的ADO,需要添加不同的引用
/// 请添加引用Microsoft ADO Ext. 2.7 for DDL and Security
/// 请添加引用Microsoft ADO Ext. 2.8 for DDL and Security
/// </summary>
public class CreateAccessDB : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
//为了方便测试,数据库名字采用比较随机的名字,以防止添加不成功时还需要重新启动IIS来删除数据库。
string dbName = "D:\\NewMDB"+DateTime.Now.Millisecond.ToString()+".mdb";
ADOX.CatalogClass cat = new ADOX.CatalogClass();
cat.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbName +";");
Response.Write("数据库:" + dbName + "已经创建成功!");
ADOX.TableClass tbl = new ADOX.TableClass();
tbl.ParentCatalog = cat;
tbl.Name="MyTable";
//增加一个自动增长的字段
ADOX.ColumnClass col = new ADOX.ColumnClass();
col.ParentCatalog = cat;
col.Type=ADOX.DataTypeEnum.adInteger; // 必须先设置字段类型
col.Name = "id";
col.Properties["Jet OLEDB:Allow Zero Length"].Value= false;
col.Properties["AutoIncrement"].Value= true;
tbl.Columns.Append (col,ADOX.DataTypeEnum.adInteger,0);
//增加一个文本字段
ADOX.ColumnClass col2 = new ADOX.ColumnClass();
col2.ParentCatalog = cat;
col2.Name = "Description";
col2.Properties["Jet OLEDB:Allow Zero Length"].Value= false;
tbl.Columns.Append (col2,ADOX.DataTypeEnum.adVarChar,25);
//设置主键
tbl.Keys.Append("PrimaryKey",ADOX.KeyTypeEnum.adKeyPrimary,"id","","");
cat.Tables.Append (tbl);
Response.Write("<br>数据库表:" + tbl.Name + "已经创建成功!");
tbl=null;
cat = null;
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
============================================================================================================
昨天有位朋友问起一个问题,客户相要一个Access格式的数据,现在的情况是程序已经实现了导出Excel,问题转化成了Excel怎么样转成Access,这点实现起来相对来说比较容易,office本身就有这个功能,但问题是,从web页面导出的Excel不能很兼容的导成Access,这是一点,还有一个方面是让客户去做这个转化工作不是太好,为了提高用户体验,最好是用代码实现了。
能不能一下子转成Access出来呢?这是我一下想的的问题,如果有的话,客户就省很多力气了,但找了一些相关资料,没有找到把GridView直接导成Access的,也就是客户端比较难实现。想到这里,客户端难实现,服务端应该好实现吧,先把我数据库中的数据转化成一个access的文件,然后客户再下载下来,这个相对来说比较容易实现。
主要思路:在服务端,把一种数据中的数据,生成access文件,下载给客户商。
分步实现:
第一:创建Access文件
第二:复制数据库格式,在Access文件中创建新表
第三:复制数据到Access文件中
第四:实现下载
创建Access文件
原本创建Access文件的语法比较简单
首先引入命名空间using ADOX; 该命名空间位于Interop.ADOX.dll文件中,ADOX.CatalogClass cat = new ADOX.CatalogClass();
cat.Create(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Data.mdb;");
这样,就能在指定的D盘下创建一个Data.mdb的Access文件。文件是创建好了,但引来了后续的一些问题,因为我们在实现下载时,要用到Response.WriteFile(文件),此时的Response.WriteFile()要求是独立享有这个文件操作权限,但前期创建时的进程一直释放不掉(如果谁有好的方法可以告我如何释放),这里还得考虑多人操作,有可能同时有多要在创建Access文件或释放这个文件。这样就会出现运行时错误,提示该文件被其他进程独占。
为了解决这个问题,同时还涉及到防止进程的释放带来的其他问题,这里我捌了一下弯来实现,先创建一个Data.mdb存放在网站的App_Data文件夹下,后期所有客户端要下导出Access表,都在这里拷贝一份,然后对新文件进行操作。另外再新建一个DownLoad文件夹用来存用户下载的Access文件。
代码如下:
//拷贝Access数据表,不移动string newfile=DateTime .Now.ToString ("MMddhhmmss")+".mdb";
File.Copy(Server.MapPath("~") + @"\App_Data\data.mdb", Server.MapPath("~") + @"\App_Data\" + newfile);复制数据库格式,在Access文件中创建新表在这里,我是从SQL Server中生表生成Access的表,当然,可以用相关的工具完成些功能,但如果对方的数据库不是SQL Se
rver可能就不太好用了。这里选择SQL Server只是一种演示数据库。
我们知道,创建一张表有几个要素,表名,字段名,字段类型,字段大小,这里,我们得先从SQL Server中查出该表的这些要素,然后创建Access表,如果是其他数据库,就要相应的转化一下对应的数据类型格式。
代码实现如下:
在web.config中创建两个连接字符串
<add name="AccessConStr" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\data.mdb;Persist Security Info=True;" providerName="System.Data.OleDb"/>
<add name="SqlConStr" connectionString="server=.;database=cum_data;uid=sa;pwd=sa;" providerName="System.Data.SqlClient"/>
这两个字符,一个用来连接SQL Server数据库一个用来连接我们创建的Access数据库。
接来查看导库的代码:
string SqlConstr = ConfigurationManager.ConnectionStrings["SqlConStr"].ConnectionString;
string sql = "select column_name,data_type,character_maximum_length from information_schema.columns where table_name='kh'";
SqlConnection con = new SqlConnection(SqlConstr);
SqlCommand cmd = new SqlCommand(sql, con);
string AccSql = "";//用来组合生成Access表的SQL语句
try
{
con.Open();
SqlDataReader DR = cmd.ExecuteReader();
while (DR.Read())
{
if (DR.GetValue(2).ToString() == "")
{
AccSql += DR.GetValue(0).ToString() + " " + DR.GetValue(1).ToString() + ",";
}
else
{
AccSql += DR.GetValue(0).ToString() + " " + DR.GetValue(1).ToString() + "(" + DR.GetValue(2).ToString() + "),";
}
}
}
catch
{ }
finally
{
con.Close();
}
AccSql = AccSql.Substring(0, AccSql.Length - 1);
string AccConstr = ConfigurationManager.ConnectionStrings["AccessConStr"].ConnectionString.Replace ("data.mdb",newfile );
OleDbConnection CON = new OleDbConnection(AccConstr);
OleDbCommand CMD = new OleDbCommand();
CMD.Connection = CON;
try
{
CON.Open();
CMD.CommandText = "create table kh(" + AccSql + ")";
CMD.ExecuteNonQuery();
}
catch
{ }
finally
{
CON.Close();
}
在上述代码中,SQL语句是比较关键的,“select column_name,data_type,character_maximum_length from information_schema.columns where table_name='kh'”,本SQL查询语句是从把原表的字段名,字段类型,字段大小查询出来,当然,不同的数据库,这个语句不近相同。
复制数据到Access文件中到现在,我们已创建好了数据表格式,接下来,就是要把数据导到Access中。
代码如下:
SqlDataAdapter DA = new SqlDataAdapter("select * from kh", SqlConstr);
DataTable DT = new DataTable();
DA.Fill(DT);
foreach (DataRow DRR in DT.Rows)
{
DRR.SetAdded();
}
OleDbDataAdapter ODA = new OleDbDataAdapter("select * from kh", AccConstr);
OleDbCommandBuilder cmb = new OleDbCommandBuilder(ODA);
ODA.Update(DT);
这里用到了Adapter的一个方法,Update,可以把DataTable中RowState为Add的数据提交会数据库,这样做起来相对要省力些。
在里,要把有数据的Access文件,移动到DownLoad文件夹下File.Move(Server.MapPath("~") + @"\App_Data\"+newfile , Server.MapPath("~") + @"\DownLoad\" + newfile);
实现下载
Response.Clear();
Response.ClearHeaders();
Response.Charset = "utf-8";
Response.Buffer = false ;
this.EnableViewState = false;
Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + newfile);
Response.WriteFile(Server.MapPath("~") + @"\DownLoad\" + newfile ,true );
Response.Flush();
Response.Close();
Response.End();
下载代码是通用的代码,这里不作说明。
整个解决方案就是把文件操作,数据操作,文件下载有机的结合在一起,实现这个用户下载Access文件的需求。
其实有时候我们去实现一个问题的时候,总体是有一定难度的,但当我们想办法,通过分解问题来实现的时候,相对来说就比较简单的实现了。
如何在Asp.net中备份Access数据库?的更多相关文章
- ASP.NET中防止Access数据库下载
如何防止Access数据库下载是一个很老的话题了,网上的讨论也比较多.这里我们给出几种在ASP.NET下防止Access数据库被下载的方法. 我们这里假设Access数据库名字为 test.mdb. ...
- 2014-08-01 ASP.NET中对SQLite数据库的操作——ADO.NET
今天是在吾索实习的第18天.我主要学习了如何在ASP.NET中对SQLite数据库的操作,其基本操作如下: 添加引用System.Data.SQLite.dll(PS:在网页里面任意找到适合的.NET ...
- 微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据
开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使 ...
- 如何在ASP.Net中实现RSA加密
在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...
- Java Web项目中连接Access数据库的配置方法
本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...
- 在ASP.NET中备份和还原数据库
昨天看了<C#项目实录>中的进销存管理系统,和其他书里讲的案例一样,无非也就是数据库增删查改,但是这个进销存系统中有一个备份和还原数据库的功能,蛮有兴趣的,看了一下代码,原来如此, ...
- 具体解释VB中连接access数据库的几种方法
在VB中,连接ACCESS数据库的方法主要有以下三种 使用ADO对象,通过编写代码訪问数据库 Connection 对象 ODBC数据源 使用ADO Data 控件高速创建数据库连接 有三种连接方法 ...
- 示例 - 如何在ASP.NET中应用Spider Studio生成的DLL?
>> 接前文 "示例 - 如何在Console应用程序中应用SpiderStudio生成的DLL?", 将其运用到ASP.NET中: 1. 创建WebApplicati ...
- 64位系统中连接Access数据库文件的一个问题
近日在windows 7 64位系统中编译以前写的程序,发现在连接Access数据库时总是出现异常,提示“Microsoft.Jet.OLEDB.4.0”未在本机注册,同样的代码在32位的xp系统中却 ...
随机推荐
- API - .add()
jQuery的 .add 很像一个collection, 官方的这个demo很形象的表达了这个意思. <!doctype html> <html lang="en" ...
- 老外写的在桌面添加快捷方式(DELPHI XE5 ANDROID)
UsesAndroidapi.JNI.GraphicsContentViewText, FMX.Helpers.Android,Androidapi.JNI.JavaTypes, FMX.Platfo ...
- 6.html5分组元素
何为分组元素,首先先看下面这个例子: <span>scolia<span>scolia</span></span> <span>scolia ...
- oh-my-zsh配置你的zsh提高shell逼格终极选择
抱歉,这篇博文推迟发布了,人都是有惰性的...看在这个牛逼闪闪的标题就原谅我吧! 为何这篇文章要归类到 mac 下? 第一个问题,稍后我们说明下. zsh是个什么东东? 第二个问题... 你应该稍微接 ...
- 手动书写小代码-foreach实现机制
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- jquery绑定事件失效的情况(转)
原文地址:http://www.thinksaas.cn/group/topic/348453/ jQuery中文api地址:http://www.jquery123.com/api/ jQuery官 ...
- jQuery选项卡插件
html结构 <ul id="tabs" class="tabs"> <li data-tab="users">Us ...
- jira插件带ui界面和几种方式
http://localhost:2990/jira/plugins/servlet/issuecrud jira插件带ui界面和几种方式 https://developer.atlassian.co ...
- IOS之表视图添加搜索栏
下面是我们要实现的效果.本效果是在上一篇自定义表视图的基础上进行更改的. 1.将Search bar and search display拖动到ViewController中.不要添加Sear ...
- .NET基础:修饰符
访问修饰符 软道语录定义: 访问修饰符就是类,属性和方法的电影分级制度 . public:访问不受限制. protected:访问仅限于包含类或从包含类派生的类型.只有包含该成员的类以及继承的类可以存 ...