DBController心得之一:利用DMO对象对SQL2005数据库进行Backup和restore的操作
生活随笔
收集整理的這篇文章主要介紹了
DBController心得之一:利用DMO对象对SQL2005数据库进行Backup和restore的操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個禮拜沒有甚么事情,所以使用C#寫了一個對數據庫進行backup,restore的工具DBController,學到和溫習了不少東西: 1。對數據庫利用sqlDMO進行宏觀的操作。 2。如何利用notifyIcon控件編寫sys stray的代碼。 3。ListView的使用。 4。contextMenu的使用。 5。C#的委托機制,delegate 6。進度調progressBar的使用。 7。C#對windows 腳本,存儲過程的調用 。。。。。。。。 今天是第一篇筆記,當中DMO的使用主要來自 TerryLee的如何用SQLDMO在ASP.NET頁面下實現數據庫的備份與恢復 ? ?1。得到數據庫中tables的列表 ?/// <summary>
??/// get the database in SqlServer 遍歷數據庫,得到talbe的列表
??/// </summary>
??public string[] GetSqlServerDatabases()
??{
???try
???{
????SqlConnection mySqlCon =? new SqlConnection("server=" + myServer + ";uid=" + myUser + ";pwd=" + myPassword + ";database=" + "");
????SqlCommand mySqlCmd = new SqlCommand("sp_databases",mySqlCon);
????
????mySqlCon.Open();
??????????????? ArrayList myDataBaseList = new ArrayList();
??????????????? ///*****************************************used SqlDataReader method,readOnly
??????????????? //SqlDataReader mySqlRdr = mySqlCmd.ExecuteReader();
??????????????? clear the former string[]
??????????????? //while(mySqlRdr.Read())
??????????????? //{
??????????????? //??? myDataBaseList.Add(mySqlRdr["DATABASE_NAME"].ToString());
??????????????? //}
??????????????? //mySqlRdr.Close();
??????????????? //mySqlCon.Dispose();
??????????????? ///*****************************************used SqlDataReader method,readOnly
??????????????? SqlDataAdapter mySqlAdt = new SqlDataAdapter("sp_databases", mySqlCon);
??????????????? DataSet myDS = new DataSet();
??????????????? mySqlAdt.Fill(myDS,"DATABASE_NAME");
??????????????? mySqlCon.Close(); foreach (DataRow row in myDS.Tables["DATABASE_NAME"].Rows)
??????????????? {
??????????????????? myDataBaseList.Add(row[0].ToString());
??????????????? } String[] myArr = (String[]) myDataBaseList.ToArray( typeof( string ) );
????return myArr;//myDataBaseList;
???}
???catch(Exception e)
???{
??????????????? throw e;????
???}
??} 2。進行對數據庫的備份, ??????? /// <summary>
??????? /// Backup DB.
??????? /// </summary>
??????? public bool backupDB(string targetFile, string toBackup)
??{
??????????? SQLDMO.Backup objBackup = new SQLDMO.BackupClass();
??????????? SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
??????????? try
??????????? {
??????????????? oSQLServer.LoginSecure = false;
??????????????? oSQLServer.Connect(myServer, myUser, myPassword);
??????????????? objBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
??????????????? objBackup.Database = toBackup;????????????????????? //Gets or sets the database on which the backup or restore operation runs.
??????????????? objBackup.Files = targetFile;??????????????????????? //指定備份的物理文件
??????????????? objBackup.BackupSetName = toBackup;???????????????? //Gets or sets the name used to identify a particular backup set.
??????????????? objBackup.BackupSetDescription = "數據庫備份Backup DB";
??????????????? objBackup.Initialize = true;
??????????????? //回調Step進行進度條的處理
??????????????? SQLDMO.BackupSink_PercentCompleteEventHandler pcech = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
??????????????? objBackup.PercentComplete += pcech;
??????????????? objBackup.SQLBackup(oSQLServer);
??????????????? return true;
??????????? }
??????????? catch (Exception e)
??????????? {
??????????????? status = e.ToString();
??????????????? throw e;
??????????? }
??????????? finally
??????????? {
??????????????? oSQLServer.DisConnect();
??????????? }???
??} 3。進行數據庫的還原操作
??????? /// <summary>
??????? /// 進行數據庫的還原操作
??????? /// </summary>
??????? /// <param name="toRestore"></param>
??????? /// <param name="targetFile"></param>
??????? /// <returns></returns>
??public bool restoreDB(string toRestore,string targetFile)
??{
??????????? if (!File.Exists(targetFile))
??????????????? return false;
???????????? if(exepro(toRestore)!=true)//執行存儲過程
??????????? {
???????????????? return false;
???????????? }
??????????? else
??????????? {
??????????????? SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
??????????????? SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
??????????????? try
??????????????? {
??????????????????? exepro(toRestore);
??????????????????? oSQLServer.LoginSecure = false;
??????????????????? oSQLServer.Connect(myServer, myUser, myPassword);
??????????????????? oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
??????????????????? oRestore.Database = toRestore;
??????????????????? /**自行修改
??????????????????? oRestore.Files = targetFile;
??????????????????? oRestore.FileNumber = 1;
??????????????????? oRestore.ReplaceDatabase = true;
??????????????????? oRestore.SQLRestore(oSQLServer); return true;
??????????????? }
??????????????? catch(Exception e)
??????????????? {
??????????????????? throw e;
??????????????? }
??????????????? finally
??????????????? {
??????????????????? oSQLServer.DisConnect();
??????????????? }
??????????? }
??} 4。殺死調用當前庫的所有進程
??????? /// <summary>
??????? /// 殺死調用當前庫的所有進程
??????? /// </summary>
??????? /// <returns></returns>
??????? private bool exepro(string toRestore)
??????? { SqlConnection conn = new SqlConnection("server=" + myServer + ";uid=" + myUser + ";pwd=" + myPassword + ";database=" + "");
??????????? SqlCommand cmd = new SqlCommand("killspid",conn);
??????????? cmd.CommandType = CommandType.StoredProcedure;
??????????? cmd.Parameters.AddWithValue("@dbname", toRestore);
??????????? try
??????????? {
??????????????? conn.Open();
??????????????? cmd.ExecuteNonQuery();
??????????????? return true;
??????????? }
??????????? catch(Exception ex)
??????????? {
??????????????? throw ex;
??????????? }
??????????? finally
??????????? {
??????????????? conn.Close();
??????????? }
??????? } 5。當中的killspid為存儲過程,代碼如下: create proc p_killspid
@dbname varchar(200) --要關閉進程的數據庫名
as
declare @sql nvarchar(500)
declare @spid nvarchar(20) declare #tb cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #tb
fetch next from #tb into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #tb into @spid
end
close #tb
deallocate #tb
go
??/// get the database in SqlServer 遍歷數據庫,得到talbe的列表
??/// </summary>
??public string[] GetSqlServerDatabases()
??{
???try
???{
????SqlConnection mySqlCon =? new SqlConnection("server=" + myServer + ";uid=" + myUser + ";pwd=" + myPassword + ";database=" + "");
????SqlCommand mySqlCmd = new SqlCommand("sp_databases",mySqlCon);
????
????mySqlCon.Open();
??????????????? ArrayList myDataBaseList = new ArrayList();
??????????????? ///*****************************************used SqlDataReader method,readOnly
??????????????? //SqlDataReader mySqlRdr = mySqlCmd.ExecuteReader();
??????????????? clear the former string[]
??????????????? //while(mySqlRdr.Read())
??????????????? //{
??????????????? //??? myDataBaseList.Add(mySqlRdr["DATABASE_NAME"].ToString());
??????????????? //}
??????????????? //mySqlRdr.Close();
??????????????? //mySqlCon.Dispose();
??????????????? ///*****************************************used SqlDataReader method,readOnly
??????????????? SqlDataAdapter mySqlAdt = new SqlDataAdapter("sp_databases", mySqlCon);
??????????????? DataSet myDS = new DataSet();
??????????????? mySqlAdt.Fill(myDS,"DATABASE_NAME");
??????????????? mySqlCon.Close(); foreach (DataRow row in myDS.Tables["DATABASE_NAME"].Rows)
??????????????? {
??????????????????? myDataBaseList.Add(row[0].ToString());
??????????????? } String[] myArr = (String[]) myDataBaseList.ToArray( typeof( string ) );
????return myArr;//myDataBaseList;
???}
???catch(Exception e)
???{
??????????????? throw e;????
???}
??} 2。進行對數據庫的備份, ??????? /// <summary>
??????? /// Backup DB.
??????? /// </summary>
??????? public bool backupDB(string targetFile, string toBackup)
??{
??????????? SQLDMO.Backup objBackup = new SQLDMO.BackupClass();
??????????? SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
??????????? try
??????????? {
??????????????? oSQLServer.LoginSecure = false;
??????????????? oSQLServer.Connect(myServer, myUser, myPassword);
??????????????? objBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
??????????????? objBackup.Database = toBackup;????????????????????? //Gets or sets the database on which the backup or restore operation runs.
??????????????? objBackup.Files = targetFile;??????????????????????? //指定備份的物理文件
??????????????? objBackup.BackupSetName = toBackup;???????????????? //Gets or sets the name used to identify a particular backup set.
??????????????? objBackup.BackupSetDescription = "數據庫備份Backup DB";
??????????????? objBackup.Initialize = true;
??????????????? //回調Step進行進度條的處理
??????????????? SQLDMO.BackupSink_PercentCompleteEventHandler pcech = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
??????????????? objBackup.PercentComplete += pcech;
??????????????? objBackup.SQLBackup(oSQLServer);
??????????????? return true;
??????????? }
??????????? catch (Exception e)
??????????? {
??????????????? status = e.ToString();
??????????????? throw e;
??????????? }
??????????? finally
??????????? {
??????????????? oSQLServer.DisConnect();
??????????? }???
??} 3。進行數據庫的還原操作
??????? /// <summary>
??????? /// 進行數據庫的還原操作
??????? /// </summary>
??????? /// <param name="toRestore"></param>
??????? /// <param name="targetFile"></param>
??????? /// <returns></returns>
??public bool restoreDB(string toRestore,string targetFile)
??{
??????????? if (!File.Exists(targetFile))
??????????????? return false;
???????????? if(exepro(toRestore)!=true)//執行存儲過程
??????????? {
???????????????? return false;
???????????? }
??????????? else
??????????? {
??????????????? SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
??????????????? SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
??????????????? try
??????????????? {
??????????????????? exepro(toRestore);
??????????????????? oSQLServer.LoginSecure = false;
??????????????????? oSQLServer.Connect(myServer, myUser, myPassword);
??????????????????? oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
??????????????????? oRestore.Database = toRestore;
??????????????????? /**自行修改
??????????????????? oRestore.Files = targetFile;
??????????????????? oRestore.FileNumber = 1;
??????????????????? oRestore.ReplaceDatabase = true;
??????????????????? oRestore.SQLRestore(oSQLServer); return true;
??????????????? }
??????????????? catch(Exception e)
??????????????? {
??????????????????? throw e;
??????????????? }
??????????????? finally
??????????????? {
??????????????????? oSQLServer.DisConnect();
??????????????? }
??????????? }
??} 4。殺死調用當前庫的所有進程
??????? /// <summary>
??????? /// 殺死調用當前庫的所有進程
??????? /// </summary>
??????? /// <returns></returns>
??????? private bool exepro(string toRestore)
??????? { SqlConnection conn = new SqlConnection("server=" + myServer + ";uid=" + myUser + ";pwd=" + myPassword + ";database=" + "");
??????????? SqlCommand cmd = new SqlCommand("killspid",conn);
??????????? cmd.CommandType = CommandType.StoredProcedure;
??????????? cmd.Parameters.AddWithValue("@dbname", toRestore);
??????????? try
??????????? {
??????????????? conn.Open();
??????????????? cmd.ExecuteNonQuery();
??????????????? return true;
??????????? }
??????????? catch(Exception ex)
??????????? {
??????????????? throw ex;
??????????? }
??????????? finally
??????????? {
??????????????? conn.Close();
??????????? }
??????? } 5。當中的killspid為存儲過程,代碼如下: create proc p_killspid
@dbname varchar(200) --要關閉進程的數據庫名
as
declare @sql nvarchar(500)
declare @spid nvarchar(20) declare #tb cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
open #tb
fetch next from #tb into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #tb into @spid
end
close #tb
deallocate #tb
go
轉載于:https://blog.51cto.com/chris/27949
總結
以上是生活随笔為你收集整理的DBController心得之一:利用DMO对象对SQL2005数据库进行Backup和restore的操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深圳电信网速测试工具
- 下一篇: VC对话框编程总结