这个礼拜没有甚么事情,所以使用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的列表
 ///
  /// get the database in SqlServer 遍历数据库,得到talbe的列表
  ///

  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。进行对数据库的备份,
        ///
        /// Backup DB.
        ///

        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。进行数据库的还原操作
        ///
        /// 进行数据库的还原操作
        ///

        ///
        ///
        ///

  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。杀死调用当前库的所有进程
        ///
        /// 杀死调用当前库的所有进程
        ///

        ///

        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