以下是小弟用来杀死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里面的。
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里面的。
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 行
当前命令发生了严重错误。应放弃任何可能产生的结果。
*/
首先感谢您的解答,不过我现在还有一个问题,我刚才也在查询分析器里面生成了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();
}
}
以上代码仍然不能杀死数据库进程,郁闷中,等待回答!
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.");
}
}
}