/********************************************************************************** * * 功能說明:備份和恢複SQL Server資料庫 * 作者: 劉功勳; * 版本:V0.1(C#2.0);時間:2007-1-1 * 當使用SQL Server時,請引用 COM組件中的,SQLDMO.dll組件 * 當使用Access中,請瀏覽添加引用以下兩個dll * 引用C:\Program Files\Common Files\System\ado\msadox.dll,該DLL包含ADOX命名空間 * 引用C:\Program Files\Common Files\System\ado\msjro.dll,該DLL包含JRO命名空間 * *******************************************************************************/using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.IO;using ADOX;//該命名空間包含建立ACCESS的類(方法)--解決方案 ==> 引用 ==> 添加引用 ==> 遊覽找到.dllusing JRO;//該命名空間包含壓縮ACCESS的類(方法)namespace EC{ /// <summary> /// 資料庫恢複和備份 /// </summary> public class SqlBackObject { public SqlBackObject() { // // TODO: 在此處添加建構函式邏輯 // } #region SQLDatabase Backup /// <summary> /// SQLDatabase Backup /// </summary> /// <param name="ServerIP">SQL伺服器IP或(Localhost)</param> /// <param name="LoginName">資料庫登入名稱</param> /// <param name="LoginPass">資料庫登入密碼</param> /// <param name="DBName">資料庫名</param> /// <param name="BackPath">備份到的路徑</param> public static void SQLBACK(string ServerIP,string LoginName,string LoginPass,string DBName,string BackPath) { SQLDMO.Backup oBackup = new SQLDMO.BackupClass(); SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass(); try { oSQLServer.LoginSecure = false; oSQLServer.Connect(ServerIP, LoginName, LoginPass); oBackup.Database = DBName; oBackup.Files = BackPath; oBackup.BackupSetName = DBName; oBackup.BackupSetDescription = "Database Backup"; oBackup.Initialize = true; oBackup.SQLBackup(oSQLServer); } catch (Exception e) { throw new Exception(e.ToString()); } finally { oSQLServer.DisConnect(); } } #endregion #region SQL恢複資料庫 /// <summary> /// SQL恢複資料庫 /// </summary> /// <param name="ServerIP">SQL伺服器IP或(Localhost)</param> /// <param name="LoginName">資料庫登入名稱</param> /// <param name="LoginPass">資料庫登入密碼</param> /// <param name="DBName">要還原的資料庫名</param> /// <param name="BackPath">Database Backup的路徑</param> public static void SQLDbRestore(string ServerIP,string LoginName,string LoginPass,string DBName,string BackPath) { SQLDMO.Restore orestore = new SQLDMO.RestoreClass(); SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass(); try { oSQLServer.LoginSecure = false; oSQLServer.Connect(ServerIP, LoginName, LoginPass); orestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database; orestore.Database = DBName; orestore.Files = BackPath; orestore.FileNumber = 1; orestore.ReplaceDatabase = true; orestore.SQLRestore(oSQLServer); } catch (Exception e) { throw new Exception(e.ToString()); } finally { oSQLServer.DisConnect(); } } #endregion #region 根據指定的檔案名稱建立Access資料庫 /// <summary> /// 根據指定的檔案名稱建立資料 /// </summary> /// <param name="DBPath">絕對路徑+檔案名稱</param> public static void CreateAccess(string DBPath) { if (File.Exists(DBPath))//檢查資料庫是否已存在 { throw new Exception("目標資料庫已存在,無法建立"); } DBPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+DBPath; //建立一個CatalogClass對象執行個體 ADOX.CatalogClass cat = new ADOX.CatalogClass(); //使用CatalogClass對象的Create方法建立ACCESS資料庫 cat.Create(DBPath); } #endregion #region 壓縮Access資料庫 /// <summary> /// 壓縮Access資料庫 /// </summary> /// <param name="DBPath">資料庫絕對路徑</param> public static void CompactAccess(string DBPath) { if (!File.Exists(DBPath)) { throw new Exception("目標資料庫不存在,無法壓縮"); } //聲明臨時資料庫名稱 string temp = DateTime.Now.Year.ToString(); temp += DateTime.Now.Month.ToString(); temp += DateTime.Now.Day.ToString(); temp += DateTime.Now.Hour.ToString(); temp += DateTime.Now.Minute.ToString(); temp += DateTime.Now.Second.ToString() + ".bak"; temp = DBPath.Substring(0, DBPath.LastIndexOf("\\") + 1) + temp; //定義臨時資料庫的連接字串 string temp2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+temp; //定義目標資料庫的連接字串 string DBPath2 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+DBPath; //建立一個JetEngineClass對象的執行個體 JRO.JetEngineClass jt = new JRO.JetEngineClass(); //使用JetEngineClass對象的CompactDatabase方法壓縮修複資料庫 jt.CompactDatabase(DBPath2, temp2); //拷貝臨時資料庫到目標資料庫(覆蓋) File.Copy(temp, DBPath, true); //最後刪除臨時資料庫 File.Delete(temp); } #endregion #region 備份Access資料庫 /// <summary> /// 備份Access資料庫 /// </summary> /// <param name="srcPath">要備份的資料庫絕對路徑</param> /// <param name="aimPath">備份到的資料庫絕對路徑</param> /// <returns></returns> public static void Backup(string srcPath,string aimPath) { if (!File.Exists(srcPath)) { throw new Exception("來源資料庫不存在,無法備份"); } try { File.Copy(srcPath,aimPath,true); } catch(IOException ixp) { throw new Exception(ixp.ToString()); } } #endregion #region 還原Access資料庫 /// <summary> /// 還原Access資料庫 /// </summary> /// <param name="bakPath">備份的資料庫絕對路徑</param> /// <param name="dbPath">要還原的資料庫絕對路徑</param> public static void RecoverAccess(string bakPath,string dbPath) { if (!File.Exists(bakPath)) { throw new Exception("備份資料庫不存在,無法還原"); } try { File.Copy(bakPath, dbPath, true); } catch (IOException ixp) { throw new Exception(ixp.ToString()); } } #endregion }}