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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM