1. 程式人生 > >C# 壓縮和修復Access數據庫

C# 壓縮和修復Access數據庫

對象 如果 web ron left bstr cli his runt

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

但是沒有更好的解決方法。

在此記錄一下,如果有人弄清楚了這個問題,麻煩留言告知。謝謝!

C# 壓縮和修復Access數據庫