Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > SQL server 2000数据还原小小经验谈
【标  题】:SQL server 2000数据还原小小经验谈
【关键字】:SQL,server,2000
【来  源】:http://blog.csdn.net/sycyb/archive/2006/06/13/794454.aspx

SQL server 2000数据还原小小经验谈

Your Ad Here

RESTORE DATABASE  DatabaseName 
                   FROM Filename
                   WITH RESTARTE
是最基本的数据库还原命令,可是执行的时候多半会出现错误提示:“为数据库正在使用,所以未能获得对数据库的排它访问权。”,数据库正在使用的解决办法很简单,就是进行还原操作时,连接的数据库为“Master”就好。但是接下来的问题是“排它访问权”。SQL Server 对现有数据库进行还原时需要切断现有的连接,即杀掉所有连接该数据库的进程。
         首先,获取所用连接该数据库的进程(strDBName 为要还原的数据库名称):
 SELECT spid FROM master..sysprocesses WHERE dbid=db_id('" + strDBName + "')
得到的便是SPID数据集,取得每个spid, 在利用 Kill   spid  命令就可以杀掉所有连接进程 ,然后执行还原语句。
在实际的应用中,可以结合开发语言特点进行编程实现。下面是我用C#做的


//TODO: 以程序的方式实现关闭当前连接数据库的连接进程
  /// <summary>
  
/// 关闭当前连接数据库的连接进程
  
/// </summary>
  
/// <param name="DBName">要关闭进程的数据库名称</param>

  private void KillSPID(string DBName)
  
{
   
string strDBName = DBName ;
   
string strSQL = String.Empty ,strSQLKill = String.Empty;
    
//因为DataReader独占连接,本程序需要两个Connection,并且连接的数据库是master,所以要初始化新的连接字符串
   string tmpConnectionString = "server=(local);uid=sa;pwd=;database=master" ;
   
   
try
   
{
    SqlConnection TmpConn 
= new SqlConnection();
    SqlConnection conn 
= new SqlConnection() ;
    TmpConn.ConnectionString 
= tmpConnectionString;
    conn.ConnectionString 
= tmpConnectionString;
    TmpConn.Open();
    conn.Open();
   
    
//读取连接当前数据库的进程
    strSQL = "select spid from master..sysprocesses where dbid=db_id('" + strDBName + "')";
    SqlCommand mycmd 
= new SqlCommand( strSQL, TmpConn);
    SqlDataReader mydr 
= mycmd.ExecuteReader() ;
   
    
//开取杀进程的数据连接
    SqlCommand mycmd1 = new SqlCommand();
    mycmd1.Connection 
= conn ;
            
    
while (mydr.Read())
    
{
     strSQLKill 
= "kill " + mydr["spid"].ToString();
     mycmd1.CommandText 
= strSQLKill ;
     mycmd1.CommandType 
= CommandType.Text ;
     mycmd1.ExecuteNonQuery(); 
//杀进程
    }

    mydr.Close();
    TmpConn.Close();
        conn.Close();
   }

   
catch (Exception Err)
   
{
    MessageBox.Show(Err.Message );
   }

  }

 

有个随SQL Server一起发布的COM,可以轻松实现数据库备份与还原,而且还提供带进度的事件,但这个COM中的参数Files不支持长文件名,就是说带有空格的文件名将会抛出异常,只有调用系统API进行转换方可解决。

[DllImport("kernel32")]
        
public static extern int GetShortPathName(string path, StringBuilder shortPath,int shortPathLength);
private void DBRestore()
{
string strRestoreFileName = String.Empty ; //要还原的数据文件包含路径的全名
  
   fBDRestore.ShowDialog();
   
   strRestoreFileName = fBDRestore.FileName; //获得要还原的数据文件名称
  
   if (g_strRestoreFileName .Length == 0 ) //是否选取路径
   {
    return ;
   }
SQLDMO.SQLServer  m_Svr 
= new SQLDMO.SQLServerClass();
m_Svr.Connect(
"(local)","sa",  strPassword) ;//连接服务器
if ( m_Svr.Status == SQLDMO.SQLDMO_SVCSTATUS_TYPE.SQLDMOSvc_Running )//连接是否成功
{
    SQLDMO.Restore m_Restore = new SQLDMO.RestoreClass();
//带进度条事件
    SQLDMO.RestoreSink_PercentCompleteEventHandler pceh =new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
    m_Restore.PercentComplete += pceh ;
    m_Restore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database ;
     StringBuilder strRestoreFileNameShort=new StringBuilder(255);
   GetShortPathName(strRestoreFileName, strRestoreFileNameShort,255); //转换成短文件名
   strRestoreFileName=strBackupFileNameShort.ToString();
    m_Restore.Files = strRestoreFileName;    
    m_Restore.Database = "test";//要还原的数据库名称
     m_Restore.ReplaceDatabase = true;
    m_Restore.Restart = true ;
    m_Restore.SQLRestore( m_Svr) ;
           }
        else
{
MessageBox.Show("密码错误","提示", MessageBoxButtons.OK, MessageBoxIcon.Information );
return ; //密码错误,退出
}
}
Oracle 中树结构查询:【上一篇】
在linux上IMP6GB数据时遭遇ORA-3113"经典错误"的解决办法参考文档:【下一篇】
【相关文章】
  • TODO::VODServer
  • 常用SQL查询命令的语法
  • mysql5.0.22编译安装过程中的一件趣事.
  • Asp备份与恢复SQL Server数据库
  • 流媒体Helix Server详细安装 配置
  • MySQL数据库学习笔记
  • 第一个sqlite3程序
  • 使用LVS(Linux Virtual Server)在Linux上搭建负载均衡的集群服务
  • 学习ASP知识之Request.ServerVariables应用
  • asp中的80020009错误
  • 【随机文章】
  • Windows 2000 文件对话框
  • 常用算法——递推法
  • 某公司VoIP组网方案(2)
  • 客观比较星际和魔兽的差别
  • 《支持中文的无组件文件上传》-- upload.inc
  • RegexBuilder: A DSL for creating regular expression
  • Windows Workflow Foundation之旅(六)——框架组成、工作流创作模式
  • JBuilder+WebLogic实现教材管理系统1
  • 用C语言编的图形界面应用程序
  • 基于asp.net实现的一个客户反馈系统
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.