DBController心得之一:利用DMO对象对SQL2005数据库进行Backup和restore的操作
2007-05-24 18:46:37
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://chris.blog.51cto.com/112473/27949 |
这个礼拜没有甚么事情,所以使用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 本文出自 “锉人Kris” 博客,请务必保留此出处http://chris.blog.51cto.com/112473/27949 本文出自 51CTO.COM技术博客 |


kris
博客统计信息
热门文章
最新评论
友情链接