C# 压缩和修复Access数据库

转载自:http://www.cnblogs.com/SparkZG/p/6530398.html

  1 using System;
  2 using System.Data;
  3 using System.Configuration;
  4 using System.Collections;
  5 using System.Web;
  6 using System.Web.Security;
  7 using System.Web.UI;
  8 using System.Web.UI.WebControls;
  9 using System.Web.UI.WebControls.WebParts;
 10 using System.Web.UI.HtmlControls;
 11 using ADOX;//该命名空间包含创建ACCESS的类(方法)--解决方案 ==> 引用 ==> 添加引用 ==> 游览找到.dll
 12 using JRO;
 13 using System.IO;//该命名空间包含压缩ACCESS的类(方法)
 14
 15
 16 /// <summary>
 17 /// 当使用Access中,请浏览添加引用以下两个dll
 18 /// 引用C:\Program Files\Common Files\System\ado\msadox.dll,该DLL包含ADOX命名空间
 19 /// 引用C:\Program Files\Common Files\System\ado\msjro.dll,该DLL包含JRO命名空间
 20 /// </summary>
 21 public partial class Access : System.Web.UI.Page
 22 {
 23     protected void Page_Load(object sender, EventArgs e)
 24     {
 25
 26     }
 27     #region 根据指定的文件名称创建Access数据库
 28     /// <summary>
 29     /// 根据指定的文件名称创建数据
 30     /// </summary>
 31     /// <param name="DBPath">绝对路径+文件名称</param>
 32     public static void CreateAccess(string DBPath)
 33     {
 34         if (File.Exists(DBPath))//检查数据库是否已存在
 35         {
 36             throw new Exception("目标数据库已存在,无法创建");
 37         }
 38         DBPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBPath;
 39         //创建一个CatalogClass对象实例
 40         ADOX.CatalogClass cat = new ADOX.CatalogClass();
 41         //使用CatalogClass对象的Create方法创建ACCESS数据库
 42         cat.Create(DBPath);
 43
 44     }
 45     #endregion
 46
 47     #region 压缩Access数据库
 48     /// <summary>
 49     /// 压缩Access数据库
 50     /// </summary>
 51     /// <param name="DBPath">数据库绝对路径</param>
 52     public static void CompactAccess(string DBPath)
 53     {
 54         if (!File.Exists(DBPath))
 55         {
 56             throw new Exception("目标数据库不存在,无法压缩");
 57         }
 58
 59         //声明临时数据库名称
 60         string temp = DateTime.Now.Year.ToString();
 61         temp += DateTime.Now.Month.ToString();
 62         temp += DateTime.Now.Day.ToString();
 63         temp += DateTime.Now.Hour.ToString();
 64         temp += DateTime.Now.Minute.ToString();
 65         temp += DateTime.Now.Second.ToString() + ".bak";
 66         temp = DBPath.Substring(0, DBPath.LastIndexOf("\\") + 1) + temp;
 67         //定义临时数据库的连接字符串
 68         string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + temp;
 69         //定义目标数据库的连接字符串
 70         string DBPath2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBPath;
 71         //创建一个JetEngineClass对象的实例
 72         JRO.JetEngineClass jt = new JRO.JetEngineClass();
 73         //使用JetEngineClass对象的CompactDatabase方法压缩修复数据库
 74         jt.CompactDatabase(DBPath2, temp2);
 75         //拷贝临时数据库到目标数据库(覆盖)
 76         File.Copy(temp, DBPath, true);
 77         //最后删除临时数据库
 78         File.Delete(temp);
 79     }
 80     #endregion
 81
 82     #region 备份Access数据库
 83     /// <summary>
 84     /// 备份Access数据库
 85     /// </summary>
 86     /// <param name="srcPath">要备份的数据库绝对路径</param>
 87     /// <param name="aimPath">备份到的数据库绝对路径</param>
 88     /// <returns></returns>
 89     public static void Backup(string srcPath, string aimPath)
 90     {
 91
 92         if (!File.Exists(srcPath))
 93         {
 94             throw new Exception("源数据库不存在,无法备份");
 95         }
 96         try
 97         {
 98             File.Copy(srcPath, aimPath, true);
 99         }
100         catch (IOException ixp)
101         {
102             throw new Exception(ixp.ToString());
103         }
104
105     }
106
107     #endregion
108
109     #region 还原Access数据库
110     /// <summary>
111     /// 还原Access数据库
112     /// </summary>
113     /// <param name="bakPath">备份的数据库绝对路径</param>
114     /// <param name="dbPath">要还原的数据库绝对路径</param>
115     public static void RecoverAccess(string bakPath, string dbPath)
116     {
117         if (!File.Exists(bakPath))
118         {
119             throw new Exception("备份数据库不存在,无法还原");
120         }
121         try
122         {
123             File.Copy(bakPath, dbPath, true);
124         }
125         catch (IOException ixp)
126         {
127             throw new Exception(ixp.ToString());
128         }
129     }
130     #endregion
131
132     /// <summary>
133     /// 数据库备份
134     /// </summary>
135     /// <param name="sender"></param>
136     /// <param name="e"></param>
137     protected void btnDBBackup_Click(object sender, EventArgs e)
138     {
139         string dbPath = "E:\\RocLeft.mdb";//数据库文件路径
140         string backupPath ="G:\\RocLeft"+DateTime.Now.ToString("yyMMddHms")+".bak";//数据库备份到的路径
141
142         string time=DateTime.Now.ToString();
143         try
144         {
145             Backup(dbPath, backupPath);
146             CompactAccess(backupPath);//压缩Access数据库
147             lblRes.Text += time + "  " + dbPath + "成功备份到-->" + backupPath + "<br/>";
148         }
149         catch (Exception ex)
150         {
151             lblRes.Text += time + " 备份失败!" + ex.Message + "<br/>";
152         }
153     }
154     /// <summary>
155     /// 数据库恢复
156     /// </summary>
157     /// <param name="sender"></param>
158     /// <param name="e"></param>
159     protected void btnGetBack_Click(object sender, EventArgs e)
160     {
161         string dbPath = "G:\\" + this.fileUrl.FileName;//还原的数据库文件路径
162         string backupPath ="E:\\RocLeft.mdb";//还原的数据
163
164         string time=DateTime.Now.ToString();
165         try
166         {
167             CreateAccess(backupPath);//根据指定的文件名称创建Access数据库
168             RecoverAccess(dbPath, backupPath);
169             lblRes.Text += time + "  " + dbPath + "成功还原到-->" + backupPath + "<br/>";
170         }
171         catch (Exception ex)
172         {
173             lblRes.Text += time + " 还原失败!" + ex.Message + "<br/>";
174         }
175     }
176 }

------------------------------------------  补充分割线 ---------------------------------------------------------

using ADOX;//该命名空间包含创建ACCESS的类(方法)--解决方案 ==> 引用 ==> 添加引用 ==> 游览找到.dll  位置在C-program files - Common Files-System-ado-msado.dllusing using JRO; 下载地址:http://www.dllzj.com/index.html

关于压缩数据库  最好在此之前检查一遍数据库是否被占用,

解决方法:http://blog.csdn.net/sx341125/article/details/39086717

http://blog.csdn.net/baple/article/details/8131717

第二个链接提到的方法:(msdn介绍见:https://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.marshal.finalreleasecomobject(v=vs.110).aspx)

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(catalog.ActiveConnection);  
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(catalog);

相当于dispose();释放。

但是没有更好的解决方法。

在此记录一下,如果有人弄清楚了这个问题,麻烦留言告知。谢谢!

时间: 2024-10-10 16:16:02

C# 压缩和修复Access数据库的相关文章

如何在Asp.net中备份Access数据库?

public   void   Create(   string   mdbPath   ) { if(   File.Exists(mdbPath)   )   //检查数据库是否已存在 { throw   new   Exception( "目标数据库已存在,无法创建 "); } //   可以加上密码,这样创建后的数据库必须输入密码后才能打开 mdbPath   =   "Provider=Microsoft.Jet.OLEDB.4.0;Data   Source= &

Access数据库怎样设置自动编号

[e良师益友网]Access在很多情况下都会用到,而且这个软件相当的实用,下面讲解怎样设置自动编号从1开始排序问题 具体实现办法如下操作: 方法一: 删个那个自动编号的字段,再建一个同样的自动编号字段即可. 方法二: 自动编号是一直增加的(每次都加1),你再增加一条记录它的编号会在前面的基础上加1(删除的也算),如果你编号为1的记录被删除了,你想再要从1开始,可以打开Access数据库,选择工具,再选择数据库实用工具,单击压缩和修复数据库,这样就OK了. 方法三: 1.在access里新建一个查

SQL编程实例:Access数据库,两张表的统计,count、sum聚合函数的使用,iif的使用,group by的使用

小媛在努力 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 在多媒体数据处理中,数据压缩算法尤为重要.小媛上完课后就想自己发明一个数据压缩算法.她想呀想,终于想到一个方法.在多媒体数据中有很多数据都是重复的,所以她想把连续相同的数据用数据出现的次数和数据本身表示.例如:1 1 1 2 3 3 3 3 3  压缩后及为3 1 1 2 5 3(表示3个1,1个2和5个3).有想法后小媛就希望把它用代码实现了.但是大家都知道小媛现在整天都忙着苦B的复习考研,连电脑都摸不到

Err.number错误号和可捕获的 Microsoft access 数据库引擎和 DAO错误说明

错误码        信息2420        数字语法错误2421        日期语法错误2422        字符串语法错误2423        ‘.’.‘!’.或 ‘()’的使用无效2424        不认识的名称2425        不认识的函数名称2426        表达式中的函数不可用2427        对象没有值2428        与域函数一起使用的参数无效2429        In 运算符缺少 ()2430        Between 运算符缺少

vs2012 access数据库 crystalreport

1.压缩一个文件夹下的所有文件 #coding=utf8 import os import tarfile __author__ = 'Administrator' def main(): cwd = os.getcwd() tar = tarfile.open('test.tar','w:gz') for root ,dir,files in os.walk(cwd): for file in files: fullpath = os.path.join(root,file) tar.add(

2018年9月计算机二级ACCESS数据库视频课程

计算机二级ACCESS数据库视频有哪些呢?现在报考计算机二级ACCESS数据库的考生越来越多,很多可能是刚刚接触计算机二级ACCESS数据库这个专业,今天课课家小编就来给大家推荐一些计算机二级ACCESS数据库视频课程. 内容简介 本视频教程紧扣计算机二级ACCESS数据库最新考试大纲,对考试中所有知识点进行了归类分析和总结,挖掘出了其中的考试重点和难点,体现出了最新的考试命题趋势.本视频教程就考试中经常出现的一些问题进行了归纳和总结,压缩了所有考试重点和难点知识.所总结的考试重点知识包括了(基

.net(C#)在Access数据库中执行sql脚本

自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 1 /// <summary> 2 /// 执行sql语句 3 /// </summary> 4 /// <param name="sql">需要执行的sql语句</param> 5 public bool ExecuteSql(string sql, ref string errorMsg) 6 { 7 Se

IIS发布站点Access数据库不能写

1..Net Framework 2.0中,共享池采用经典模式,在.Net Framework 2.0中,共享池采用集成模式. 2.在共享池高级设置中将"启用32位应用程序"属性值设置为true. 3.在数据库文件夹中,将IUSR_***权限设置为允许修改,写入.将数据库文件属性栏将"只读"前的"√"点掉即可. 4.在上传文件夹中,将IUSR_***权限设置为允许修改,写入. IIS发布站点Access数据库不能写,布布扣,bubuko.com

Java 连接MS Access数据库

java连接MS Access的两种方式: 1.JDBC-ODBC Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar.但是,如此一来程序部署的每个机器上都要进行设置不方面.所以现在不会使用啦. 2.JDBC java也可以和连接其他数据库一样连接MS Access,导入数据库相应的jar包,进行连接. java Access JDBC jar包:Access_JDBC30.jar 具体连接,参考下面代码: 复制代码 1 try { 2