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();释放。
但是没有更好的解决方法。
在此记录一下,如果有人弄清楚了这个问题,麻烦留言告知。谢谢!