C# 压缩和修复Access数据库

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();释放。

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

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