WPF C#开发中利用SQLDMO进行数据库备份还原操作中的注意点

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 首先下载SQLDMO文件包,下载地址:SQLDMO 下载后,进行解压,然后按照下面的步骤进行操作:第一步:首先将msvcr71.dll, SQLDMO.DLL, Resources/2052/sqldmo.rll,Resources/1033/sqldmo.rll 拷贝到C:/Program Files/Microsoft SQL Server/80/Tools/Binn目录。

首先下载SQLDMO文件包,下载地址:SQLDMO

 

下载后,进行解压,然后按照下面的步骤进行操作:

第一步:首先将msvcr71.dll, SQLDMO.DLL, Resources/2052/sqldmo.rll,Resources/1033/sqldmo.rll 拷贝到C:/Program Files/Microsoft SQL Server/80/Tools/Binn目录。

第二步:打开开始,在运行中输入 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 的读取权限。

 

即使进行注册后,运行程序中还会报错,类似如下信息:

event invocation for COM objects requires event to be attributed with DispIdAttribute

这个原因是在项目Bin中引用SQLDMO.dll文件后,该dll属性中的“嵌入互操作类型”的值默认是True造成的,修改成False即可。

 

下面附上数据库备份还原操作的主要代码:

----------------------------------数据备份------------------------------------------------

  private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            //备份
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "(*.mdf)|*.mdf";
            saveFileDialog.FilterIndex = 0;
            if (saveFileDialog.ShowDialog() == true)
            {
                string filePath = saveFileDialog.FileName;
                SQLBACK(Global.DB_SOURCE, Global.DB_UID, Global.DB_UPWD, Global.DB_NAME, filePath);
            }
        }

        #region SQL数据库备份函数

        /// < summary>
        /// SQL数据库备份
        /// < /summary>
        /// < param name="ServerIP">SQL服务器IP或(Localhost)< /param>
        /// < param name="LoginUserName">数据库登录名< /param>
        /// < param name="LoginPass">数据库登录密码< /param>
        /// < param name="DBName">数据库名< /param>
        /// < param name="BackPath">备份到的路径< /param>
        public  void SQLBACK(string ServerIP, string LoginUserName, string LoginPass, string DBName, string BackPath)
        {

            SQLDMO.Backup oBackup = new SQLDMO.Backup();
            SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServer();
            oBackup.Action = 0;
            oBackup.Initialize = true;
            SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step);
            oBackup.PercentComplete += pceh;
            try
            {
                oSQLServer.LoginSecure = false;
                oSQLServer.Connect(ServerIP, LoginUserName, LoginPass);
                oBackup.Action = SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
                oBackup.Database = DBName;
                oBackup.Files = @"" + BackPath + "";
                oBackup.BackupSetName = DBName;
                oBackup.BackupSetDescription = "数据库备份";
                oBackup.Initialize = true;
                oBackup.SQLBackup(oSQLServer);
                MessageBox.Show("备份成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("备份失败,原因为:" + ex.Message);
            }
            finally
            {
                oSQLServer.DisConnect();
            }
        }

        private void Step(string message, int percent)
       {
              this.pb.Value = percent;
       }


 

      --------------------------------数据还原----------------------------------------------------------

      

 private static DataRestore _Instance = null; //页面实例

        public DataRestore()
        {
            InitializeComponent();
        }

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

        /// <summary>
        /// 获取数据库服务器列表
        /// </summary>
        private void GetSQLServerList()
        {
            SQLDMO._Application sqlApp = new SQLDMO.Application();
            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 btnSave_Click(object sender, RoutedEventArgs e)
        {
            //还原
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "(*.mdf)|*.mdf";
            openFileDialog.FilterIndex = 0;
            if (openFileDialog.ShowDialog() == true)
            {
                string filePath = openFileDialog.FileName; //获取选中的备份文件,进行还原操作
                SQLDbRestore(Global.DB_SOURCE, Global.DB_UID, Global.DB_UPWD, Global.DB_NAME, filePath);
            }
        }

        #region SQL恢复数据库

        /// < summary>
        /// SQL恢复数据库
        /// < /summary>
        /// < param name="ServerIP">SQL服务器IP或(Localhost)< /param>
        /// < param name="LoginUserName">数据库登录名< /param>
        /// < param name="LoginPass">数据库登录密码< /param>
        /// < param name="DBName">要还原的数据库名< /param>
        /// < param name="BackPath">数据库备份的路径< /param>
        public void SQLDbRestore(string ServerIP, string LoginUserName, string LoginPass, string DBName, string BackPath)
        {
            SQLDMO.Restore oRestore = new SQLDMO.Restore();
            SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServer();
            oRestore.Action = 0;
            //SQLDMO.RestoreSink_PercentCompleteEventHandler pceh = new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
            //oRestore.PercentComplete += pceh;
            try
            {
                oSQLServer.Connect(ServerIP, LoginUserName, LoginPass);
                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() == "JCWZDB".ToUpper())
                    {
                        oSQLServer.KillProcess(lPID);
                    }
                }
                oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                oRestore.Database = DBName;
                oRestore.Files = BackPath;
                oRestore.FileNumber = 1;
                oRestore.ReplaceDatabase = true;
                oRestore.SQLRestore(oSQLServer);
                MessageBox.Show("数据还原成功!");
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("数据还原失败: " + ex.ToString());
            }
            finally
            {
                oSQLServer.DisConnect();
            }
        }

        private void Step(string message, int percent)
        {
            this.pb.Value = percent;
        }

        #endregion


相关文章
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
61 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
3月前
|
SQL 关系型数据库 MySQL
Python 数据库访问与ORM框架——打造高效开发利器
Python 作为一门广泛使用的编程语言,其在数据库访问方面也有着较为成熟的解决方案,其中ORM框架更是成为了开发者们的首选。本文将介绍 Python 中数据库访问和 ORM 框架的基本概念,以及如何使用 SQLAlchemy 这一优秀的 ORM 框架进行开发。
|
3月前
|
关系型数据库 API 数据库
Python数据库访问与ORM框架:加速开发、提升效率
在现代软件开发中,数据库是不可或缺的组成部分。本文介绍了Python中数据库访问的重要性,并探讨了ORM框架(例如SQLAlchemy)如何帮助程序员加速开发、提升效率。通过使用ORM框架,开发人员可以轻松地将Python对象映射到数据库表,并且可以通过简洁的API进行数据库操作。此外,本文还讨论了ORM框架在处理复杂查询、维护数据一致性和实现数据库迁移方面的优势。
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
|
3月前
|
存储 关系型数据库 MySQL
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
47 0
|
3月前
|
缓存 数据库 索引
高效后端开发:数据库优化策略详解
数据库优化是后端开发中不可或缺的一部分。本文将从多个方面详细阐述数据库优化策略,包括数据表设计、索引优化、查询性能优化等。通过本文的学习,读者可以了解如何优化数据库,提升后端应用性能和稳定性。
68 1
|
3天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
24天前
|
存储 SQL 数据库
C# 将 Word 转文本存储到数据库并进行管理
C# 将 Word 转文本存储到数据库并进行管理
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
23 1
|
1月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
131 1
C# .NET面试系列十:数据库概念知识