以下是小弟用来杀死sql server 2005数据库进程的程序片段,请高手指教一下:
public bool KillProcessOfDb()
        {
            SqlConnection con = new SqlConnection("server="+this.server+";uid="+this.uid+";pwd="+this.pwd+";database=master;");
            SqlCommand cmd = new SqlCommand("KillSpid", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@dbname", "aaa");            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception E)
            {
                return false;
            }
            finally 
            {
                con.Close();
            }
        }
以上程序在sql server 2000下运行不错,但是到2005下运行就说找不到存储过程KillSpid了,我查看了master数据库下所有的存储过程,就是没有找一个类似或者相关的(可能是自己没有发现),请高手指点一下!谢谢!我是写在asp.net里面的。

解决方案 »

  1.   

    在2005下:
    use master
    go
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    CREATE proc [dbo].[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 
    在数据库prime中启动一个连续运行的存储过程后执行:
    exec p_killspid prime
    /*
    SPID 55: 正在进行事务回滚。估计回滚已完成: 0%。估计剩余时间: 0 秒。
    SPID 55: 正在进行事务回滚。估计回滚已完成: 0%。估计剩余时间: 0 秒。
    */数据库prime连接窗口显示:
    /*
    消息 0,级别 11,状态 0,第 0 行
    当前命令发生了严重错误。应放弃任何可能产生的结果。
    消息 0,级别 20,状态 0,第 0 行
    当前命令发生了严重错误。应放弃任何可能产生的结果。
    */
      

  2.   

    qianjin036a 老兄:
        首先感谢您的解答,不过我现在还有一个问题,我刚才也在查询分析器里面生成了p_killspid这个存储过程,不过,在asp.net里面运行如下程序还是会出错,麻烦再指点一下,谢谢,非常感谢!
        public bool KillProcessOfDb()
            {
                SqlConnection con = new SqlConnection("server="+this.server+";uid="+this.uid+";pwd="+this.pwd+";database=master;");
                SqlCommand cmd = new SqlCommand("sp_killspid", con);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter spr = new SqlParameter("@dbname", SqlDbType.VarChar, 20);
                spr.Value="Teacher";
                cmd.Parameters.Add(spr);            try
                {
                    con.Open();
                    cmd.ExecuteNonQuery();
                    return true;
                }
                catch (Exception E)
                {
                    return false;
                }
                finally 
                {
                    con.Close();
                }
            }
    以上代码仍然不能杀死数据库进程,郁闷中,等待回答!
      

  3.   

    晕啊,我在查询分析器里面执行exec sp_killspid 'Teacher'是没有问题的啊,为什么把这个写到asp.net里面就出错了呢!请高手指点!
      

  4.   

    你找遇啦!!以下是本人的一个完整的代码。
    1、在数据库SQL2005的查询窗口中运行以下代码:
    use master
    go
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    CREATE proc [dbo].[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 2、在ASP。NET页面中写入下面的类
        private bool exepro()//在还原数据库前,将相应的数据库进程杀掉!!
        {
            SqlConnection con = new SqlConnection("server='本机名称';database='master';uid='sa';pwd='数据库密码'");
            SqlCommand com = new SqlCommand("p_killspid", con);
            com.CommandType = CommandType.StoredProcedure;
            com.Parameters.Add("@dbname", "Northwindxxxxxxxx");//Northwindxxxxxxxx为要杀死的数据库进程
            try
            {
                con.Open();
                com.ExecuteNonQuery();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                con.Close();
            }
        }
    3、在还原数据库前调用上面写的类    private void DbRestore()
        {
            if (exepro() == true)
            {
                try
                {
                    SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
                    SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
                    oSQLServer.LoginSecure = false;
                    oSQLServer.Connect("本机名称", "sa", "数据库密码");
                    oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                    oRestore.Database = "Northwindxxxxxxxx";
                    oRestore.Files = @"d:\\Northwindxxxxxxxx.bak";
                    oRestore.FileNumber = 1;
                    oRestore.ReplaceDatabase = true;
                    oRestore.SQLRestore(oSQLServer);
                }
                catch
                {
                    throw new Exception("The method or operation is not implemented.");
                }
            }
        }