C#中结合使用SQLDMO实现备份、还原SQLserver数据库

//---DBTools.cs

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;

namespace  Magicbit.Framework
{
    
public   partial   class  DBTools : Form
    {

        
private   static  DBTools _Instance  =   null ;      
        
public   static  DBTools Instance()      
        {
            
if  (_Instance  ==   null )
            {
                _Instance 
=   new  DBTools();
            }
            
else
            {
                MessageBox.Show(
" 已经有一个实例在运行! " );
            }
            
return  _Instance;
        }

        
        
public  DBTools()
        {
            InitializeComponent();
        }

        
private   void  BackAndRecoverDB_Load( object  sender, EventArgs e)
        {
            
this .txtSavePath.Text  =  Application.StartupPath;
            
// this.GetSQLServerList();
        }
        
private   void  GetSQLServerList()
        {
            
// get all available SQL Servers    
            SQLDMO._Application sqlApp  =   new  SQLDMO.ApplicationClass();
            SQLDMO.NameList sqlServers 
=  sqlApp.ListAvailableSQLServers();
            
for  ( int  i  =   0 ; i  <  sqlServers.Count; i ++ )
            {
                
object  srv  =  sqlServers.Item(i  +   1 );
                
if  (srv  !=   null )
                {
                    
this .cboServers.Items.Add(srv);
                }
            }
            
if  ( this .cboServers.Items.Count  >   0 )
                
this .cboServers.SelectedIndex  =   0 ;
            
else
                
this .cboServers.Text  =   " <No available SQL Servers> "
        
        }
        
private   void  GetBackUpDB()
        {
            SQLDMO.Application sqlApp   
=   new  SQLDMO.ApplicationClass();
            SQLDMO.SQLServer srv        
=   new  SQLDMO.SQLServer();
            srv.Connect(
this .cboServers.Text.Trim(), this .txtUserName.Text.Trim(), this .txtPassword.Text.Trim());
            
foreach  (SQLDMO.Database db  in  srv.Databases)
            {
                
if  (db.Name  !=   null )
                    
this .cboDatabase.Items.Add(db.Name);
            }
        
        }
        
private   void  pictureBox1_Click( object  sender, EventArgs e)
        {
            MessageBox.Show(
" 欢迎使用数据库备份、还原工具,本工具将协助你备份和还原数据库,确保数据安全! " " 备份您的数据库 " );
        }

        
private   void  button1_Click( object  sender, EventArgs e)
        {
            
this .GetBackUpDB();
        }
        
private   void  BackUpDB()
        {

            
string  selfName  =   this .txtSavePath.Text.Trim()  +   @" "   +   this .cboDatabase.Text.Trim()  +   " _ " +  System.DateTime.Now.ToString( " yyyyMMddHHmmss " ) + " .DAT " ;
            
string  deviceName  =   this .cboDatabase.Text.Trim() + " bak " ;
            
string  remark  =   " 数据备份 " ;

            
// BACKUP DB
            SQLDMO.Backup oBackup  =   new  SQLDMO.BackupClass();
            SQLDMO.SQLServer oSQLServer 
=   new  SQLDMO.SQLServerClass();
            oBackup.Action 
=   0  ; 
            oBackup.Initialize 
=   true  ; 
            SQLDMO.BackupSink_PercentCompleteEventHandler pceh 
=   new  SQLDMO.BackupSink_PercentCompleteEventHandler(Step); 
            oBackup.PercentComplete 
+=  pceh; 
            
try
            {
                oSQLServer.LoginSecure 
=   false ;
                oSQLServer.Connect(
this .cboServers.Text.Trim(), this .txtUserName.Text.Trim(), this .txtPassword.Text.Trim());
                oBackup.Action 
=  SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
                oBackup.Database 
=   this .cboDatabase.Text.Trim(); // 数据库名
                oBackup.Files  =  selfName; // 文件路径
                oBackup.BackupSetName  =  deviceName; // 备份名称
                oBackup.BackupSetDescription  =  remark; // 备份描述
                oBackup.Initialize  =   true ;
                oBackup.SQLBackup(oSQLServer);

            }
            
catch (System.Exception ex)
            {
                MessageBox.Show(
" 数据备份失败: "   +  ex.ToString());
            }
            
finally
            {
                oSQLServer.DisConnect();
            }
        }
        
private   void  Step( string  message,  int  percent)
        {
            
this .progressBar1.Value  =  percent;
        }
        
private   void  button2_Click( object  sender, EventArgs e)
        {
            
this .Cursor  =  Cursors.WaitCursor;
            
this .label6.Visible  =   true ;
            
this .progressBar1.Visible  =   true ;
            
this .BackUpDB();
            
this .Cursor  =  Cursors.Default;
            
this .label6.Text  =   " 备份已完成. " ;
        }

        
public   void  RestoreDB()
        { 
            
string  filePath  =   this .txtBackUpFile.Text.Trim();
            SQLDMO.Restore oRestore 
=   new  SQLDMO.RestoreClass();
            SQLDMO.SQLServer oSQLServer 
=   new  SQLDMO.SQLServerClass();
            oRestore.Action 
=   0  ; 
            SQLDMO.RestoreSink_PercentCompleteEventHandler pceh 
=   new  SQLDMO.RestoreSink_PercentCompleteEventHandler(Step); 
            oRestore.PercentComplete 
+=  pceh; 
            
try
            {
            oSQLServer.Connect(
this .cboServers.Text.Trim(), this .txtUserName.Text.Trim(), this .txtPassword.Text.Trim());
            SQLDMO.QueryResults qr 
=  oSQLServer.EnumProcesses( - 1 ) ; 
            
int  iColPIDNum  =   - 1  ; 
            
int  iColDbName  =   - 1  ; 
            
// 杀死其它的连接进程
             for ( int  i = 1 ;i <= qr.Columns;i ++
            { 
                
string  strName  =  qr.get_ColumnName(i) ; 
                
if  (strName.ToUpper().Trim()  ==   " SPID "
                { 
                     iColPIDNum 
=  i ; 
                } 
                
else   if  (strName.ToUpper().Trim()  ==   " DBNAME "
                { 
                    iColDbName 
=  i ; 
                } 
                
if  (iColPIDNum  !=   - 1   &&  iColDbName  !=   - 1
                
break  ; 
                } 
                
for ( int  i = 1 ;i <= qr.Rows;i ++
                { 
                    
int  lPID  =  qr.GetColumnLong(i,iColPIDNum) ; 
                    
string  strDBName  =  qr.GetColumnString(i,iColDbName) ; 
                    
if  (strDBName.ToUpper()  ==   " CgRecord " .ToUpper()) 
                    oSQLServer.KillProcess(lPID) ; 
                } 

                oRestore.Action 
=  SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                oRestore.Database 
=   this .cboDBtoBackup.Text;
                oRestore.Files 
=  filePath;
                oRestore.FileNumber 
=   1 ;
                oRestore.ReplaceDatabase 
=   true ;
                oRestore.SQLRestore(oSQLServer);

            }
            
catch (System.Exception ex)
            {
                MessageBox.Show(
" 数据还原失败: "   +  ex.ToString());
            }
            
finally
            {
                oSQLServer.DisConnect();
            }


        
        }

        
private   void  button3_Click( object  sender, EventArgs e)
        {
            
this .folderBrowserDialog1.Description  =   " 请选择备份文件存放目录 " ;
            
this .folderBrowserDialog1.ShowNewFolderButton  =   true ;
            
this .folderBrowserDialog1.ShowDialog();
            
this .txtSavePath.Text  =   this .folderBrowserDialog1.SelectedPath;
        }

        
private   void  button4_Click( object  sender, EventArgs e)
        {
            
this .openFileDialog1.DefaultExt  =   " *.dat " ;
            
this .openFileDialog1.Title  =   " 请选择要还原的数据库备份文件. " ;
            
this .openFileDialog1.ShowDialog();
            
this .txtBackUpFile.Text  =   this .openFileDialog1.FileName;
        }

        
private   void  button5_Click( object  sender, EventArgs e)
        {
            
this .Cursor  =  Cursors.WaitCursor;
            
this .label6.Visible  =   true ;
            
this .progressBar1.Visible  =   true ;
            
this .RestoreDB();
            
this .Cursor  =  Cursors.Default;
            
this .label6.Text  =   " 还原已完成. " ;
        }

     


    }
}

相关源码:下载地址一

参考:

SQL-DMO FAQ :http://www.sqldev.net/sqldmo/SQL-DMO-FAQ.htm

SQLDMO For C#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sql server sqldmo_x86_x64,C#数据库备份还原很好用的.dll,里面有使用方法,引用Interop.SQLDMO.dll后的注意事项。 SQLDMO.dll是个好东西,ASP.NET利用它可以实现在线备份还原数据库等各种功能。近日有客户要求为其在后台添加一个管理数据库的功能。于是就出现了这篇文章。 由于客户的数据库和WEB服务不再同一台服务器,当我们把网站部署在服务器上以后,运行程序,提示如下错误: Retrieving the COM class factory for component with CLSID {10020200-E260-11CF-AE68-00AA004A34D5} failed due to the following error: 80040154. 而客户又不想在这台电脑安装MSSQL,所以我们只需要在没有安装MSSQL的电脑上注册SQLDMO.DLL组件。 第一步:首先将msvcr71.dll, SQLDMO.DLL, Resources\2052\sqldmo.rll,Resources\1033\sqldmo.rll 拷贝到C:\Program Files\Microsoft SQL Server\80\Tools\Binn目录。 下载SQLDMO文件 第二步:打开开始,在运行输入 regsvr32 "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\sqldmo.dll" 注册sqldmo.dll。 正常情况下,经过以上两个步骤,网页就应该可以访问了的。 但是我们经过以上两次操作后,访问网页依然提示如下错误: Retrieving the COM class factory for component with CLSID {10020200-E260-11CF-AE68-00AA004A34D5} failed due to the following error: 80070005.后经过一段时间的检查,我们发现C:\Program Files\文件夹仅有Administrator和System的控制权限,而没有其他任何用户的权限,因此我们为Microsoft SQL Server文件夹增加上Network Service 的读取权限。 至此,问题得到解决!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值