none
怎么用SQLDMO恢复数据库? RRS feed

答案

  • 虽然不是需要的c#,不过还是感谢提供的帮助。

     

    我在sql server的联机帮助中找到了英文的帮助,写的有些简单,但是大概意思还是可以理解了。再经过实验,现在就把用SQL-DMO进行数据库还原的c#代码及说明写下,具体功能根据实际需要编写,这个旨在展示部分功能,希望他人能有所借鉴。

     

    /*
    * 首先在项目中添加了对COM组件 SQLDMO 的引用,即SQL分布式管理对象。
    * 下面将分别使用SQLDMO的SQLServer、Restore和StoredProcedure对象进行
    * 数据库还原、数据库属性修改和创建存储过程的操作。
    */
                SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();  //数据库服务类
                SQLDMO.Restore oSQLRestore = new SQLDMO.RestoreClass();  //数据库还原类
                SQLDMO.StoredProcedure proc = new SQLDMO.StoredProcedureClass();  //存储过程类

     

                //尝试启动本地SQL Server数据库服务,如果产生异常,则说明服务已经启动,将直接连接数据库
                //数据库服务登录用户名为 sa ,密码为空。
                try
                {

                    //参数中的第一个 true ,表示如果启动服务成功,则继续连接到该数据库
                    oSQLServer.Start(true, ".", "sa", "");  //启动本地数据库服务,如果成功启动,将同时连接该数据库
                }
                catch (Exception e)
                {
                    oSQLServer.Connect(".", "sa", "");  //连接本地数据库
                }

     

               //操作数据库之前,先关闭了所有正在使用此数据库的连接

                try
                {
                    //向数据库发送命令并执行,返回一个查询集
                    //该查询命令将得到正在使用名为 test 的数据库的所有活动连接的进程id
                    SQLDMO.QueryResults qr = oSQLServer.ExecuteWithResults("select spid from master..sysprocesses where dbid=db_id('test')", 0);
                    if (qr.Rows > 0)
                    {
                        for (int i = 1; i <= qr.Rows; i++ )
                            //执行一个不返回任何值的命令,该命令将断开所有正使用名为 test 的数据库的活动连接,为还原数据库做准备
                            oSQLServer.ExecuteImmediate("kill " + qr.GetColumnLong(i, 1).ToString(), SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default, 0);
                    }

     

                    //还原数据库操作
                    oSQLRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                    oSQLRestore.Database = "test";  //数据库名为 test
                    oSQLRestore.Files = System.Environment.CurrentDirectory + "\\Database\\test.bat";  //使用的备份文件为程序执行目录下名为 Database 文件夹下名为 test.bat 的文件

     

                     /*RelocateFiles属性用于重新部署还原的数据库文件,可以用 multistring 来设置该属性,写法如下:

                      *"[数据库逻辑文件名1],[文件1重新部署的路径],[逻辑文件名2],[文件2重新部署的路径]....."

                      *路径包括物理文件名

                     */

                    oSQLRestore.RelocateFiles = "[test_Data],[" + System.Environment.CurrentDirectory + "\\Database\\test_Data.mdf],[test_log],["
                        + System.Environment.CurrentDirectory + "\\Database\\test_log.ldf]";  //将数据库文件和日志文件重新部署到程序执行目录下名为 Database 的文件夹中
                    oSQLRestore.ReplaceDatabase = true;  //操作将覆盖原有同名数据库
                    oSQLRestore.SQLRestore(oSQLServer);  //执行数据库还原操作

     

                    //创建存储过程和修改数据库文件属性
                    proc.Name = "testProc";  //存储过程名称为 testProc
                    //写创建语句,就是t-sql语句,我加了转义符为了格式好看
                    proc.Text = "create proc testProc\n\t@var1 int, @var2 int,\n\t@out_var1 int output, @out_var2 int output\n"
                        + "as\n"
                        + "...........";  //语句我就省略了

     

                    //下面的循环找到了我还原的数据库 test ,修改了他的部分属性,并且在上面创建了刚才的存储过程 testProc

                    //注意,数据文件和日志文件分别在:FileGroups集合的DBFiles集合下面和TransactionLog的LogFiles集合下面

                    for (int i = 1; i <= oSQLServer.Databases.Count; i++)
                    {
                        if (oSQLServer.Databases.Item(i, oSQLServer).Name == "test")
                        {
                            oSQLServer.Databases.Item(i, oSQLServer).FileGroups.Item(1).DBFiles.Item(1).MaximumSize = int.MaxValue;  //修改数据库最大文件大小为最大
                            oSQLServer.Databases.Item(i, oSQLServer).TransactionLog.LogFiles.Item(1).MaximumSize = int.MaxValue;  //修改日志最大文件大小为最大
                            oSQLServer.Databases.Item(i, oSQLServer).StoredProcedures.Add(proc);  //创建存储过程到数据库 Compete 中
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    throw;

                }
                finally
                {
                    oSQLServer.Close();  //关闭数据库连接
                }

     

     

    由此可见,SQLServer对象代表了所连接主机的数据库服务本身,功能也是十分强大的,可以对其中的任何数据库进行任何可能的操作,而且操作也十分的简单。但是效率方面就没有测试过。我只实验了上面的操作。

    再次感谢 feiyun0112 的帮助
    2008年3月2日 16:59

全部回复

  • 虽然不是需要的c#,不过还是感谢提供的帮助。

     

    我在sql server的联机帮助中找到了英文的帮助,写的有些简单,但是大概意思还是可以理解了。再经过实验,现在就把用SQL-DMO进行数据库还原的c#代码及说明写下,具体功能根据实际需要编写,这个旨在展示部分功能,希望他人能有所借鉴。

     

    /*
    * 首先在项目中添加了对COM组件 SQLDMO 的引用,即SQL分布式管理对象。
    * 下面将分别使用SQLDMO的SQLServer、Restore和StoredProcedure对象进行
    * 数据库还原、数据库属性修改和创建存储过程的操作。
    */
                SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();  //数据库服务类
                SQLDMO.Restore oSQLRestore = new SQLDMO.RestoreClass();  //数据库还原类
                SQLDMO.StoredProcedure proc = new SQLDMO.StoredProcedureClass();  //存储过程类

     

                //尝试启动本地SQL Server数据库服务,如果产生异常,则说明服务已经启动,将直接连接数据库
                //数据库服务登录用户名为 sa ,密码为空。
                try
                {

                    //参数中的第一个 true ,表示如果启动服务成功,则继续连接到该数据库
                    oSQLServer.Start(true, ".", "sa", "");  //启动本地数据库服务,如果成功启动,将同时连接该数据库
                }
                catch (Exception e)
                {
                    oSQLServer.Connect(".", "sa", "");  //连接本地数据库
                }

     

               //操作数据库之前,先关闭了所有正在使用此数据库的连接

                try
                {
                    //向数据库发送命令并执行,返回一个查询集
                    //该查询命令将得到正在使用名为 test 的数据库的所有活动连接的进程id
                    SQLDMO.QueryResults qr = oSQLServer.ExecuteWithResults("select spid from master..sysprocesses where dbid=db_id('test')", 0);
                    if (qr.Rows > 0)
                    {
                        for (int i = 1; i <= qr.Rows; i++ )
                            //执行一个不返回任何值的命令,该命令将断开所有正使用名为 test 的数据库的活动连接,为还原数据库做准备
                            oSQLServer.ExecuteImmediate("kill " + qr.GetColumnLong(i, 1).ToString(), SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default, 0);
                    }

     

                    //还原数据库操作
                    oSQLRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                    oSQLRestore.Database = "test";  //数据库名为 test
                    oSQLRestore.Files = System.Environment.CurrentDirectory + "\\Database\\test.bat";  //使用的备份文件为程序执行目录下名为 Database 文件夹下名为 test.bat 的文件

     

                     /*RelocateFiles属性用于重新部署还原的数据库文件,可以用 multistring 来设置该属性,写法如下:

                      *"[数据库逻辑文件名1],[文件1重新部署的路径],[逻辑文件名2],[文件2重新部署的路径]....."

                      *路径包括物理文件名

                     */

                    oSQLRestore.RelocateFiles = "[test_Data],[" + System.Environment.CurrentDirectory + "\\Database\\test_Data.mdf],[test_log],["
                        + System.Environment.CurrentDirectory + "\\Database\\test_log.ldf]";  //将数据库文件和日志文件重新部署到程序执行目录下名为 Database 的文件夹中
                    oSQLRestore.ReplaceDatabase = true;  //操作将覆盖原有同名数据库
                    oSQLRestore.SQLRestore(oSQLServer);  //执行数据库还原操作

     

                    //创建存储过程和修改数据库文件属性
                    proc.Name = "testProc";  //存储过程名称为 testProc
                    //写创建语句,就是t-sql语句,我加了转义符为了格式好看
                    proc.Text = "create proc testProc\n\t@var1 int, @var2 int,\n\t@out_var1 int output, @out_var2 int output\n"
                        + "as\n"
                        + "...........";  //语句我就省略了

     

                    //下面的循环找到了我还原的数据库 test ,修改了他的部分属性,并且在上面创建了刚才的存储过程 testProc

                    //注意,数据文件和日志文件分别在:FileGroups集合的DBFiles集合下面和TransactionLog的LogFiles集合下面

                    for (int i = 1; i <= oSQLServer.Databases.Count; i++)
                    {
                        if (oSQLServer.Databases.Item(i, oSQLServer).Name == "test")
                        {
                            oSQLServer.Databases.Item(i, oSQLServer).FileGroups.Item(1).DBFiles.Item(1).MaximumSize = int.MaxValue;  //修改数据库最大文件大小为最大
                            oSQLServer.Databases.Item(i, oSQLServer).TransactionLog.LogFiles.Item(1).MaximumSize = int.MaxValue;  //修改日志最大文件大小为最大
                            oSQLServer.Databases.Item(i, oSQLServer).StoredProcedures.Add(proc);  //创建存储过程到数据库 Compete 中
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    throw;

                }
                finally
                {
                    oSQLServer.Close();  //关闭数据库连接
                }

     

     

    由此可见,SQLServer对象代表了所连接主机的数据库服务本身,功能也是十分强大的,可以对其中的任何数据库进行任何可能的操作,而且操作也十分的简单。但是效率方面就没有测试过。我只实验了上面的操作。

    再次感谢 feiyun0112 的帮助
    2008年3月2日 16:59