1、构建存储过程,把KILL 进程号写成@sql
ALTER PROCEDURE [dbo].[usp_kill_spid]
@sql NVARCHAR(20)AS
BEGIN
EXEC sp_executesql @sql
END
2、c#中写方法
public void KillSpid(string sql)
{
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("usp_kill_spid", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@sql", sql);
con.Open();
//下面这句是专门针对 time时间已到的异常处理
cmd.CommandTimeout = 120;
cmd.ExecuteNonQuery();
con.Close();
}
}
}
3、调用方法干掉死锁进程
private void simpleButton1_Click(object sender, EventArgs e)
{
ProcSqlHelper.ExecuteNonQuery("usp_lock_who", CommandType.StoredProcedure);
DataTable dt = ProcSqlHelper.ExecuteDatatable("SELECT * FROM who", CommandType.Text);
dataGridView1.DataSource = dt;
int a = 0;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
int r = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value.ToString());
if (r != 0 && Convert.ToInt32(ProcSqlHelper.ExecuteScalar(@"select blk from who where spid =@r",CommandType.Text,new SqlParameter[]{new SqlParameter("@r",r)})) == 0)
{
string sql = "KILL" + " " + r.ToString();
KillSpid(sql);
a = a + 1;
MessageBox.Show("干掉了进程号{0}!", r.ToString());
}
}
if (a > 0)
{ MessageBox.Show("干掉了{0}个进程!",a.ToString()); }
else
{ MessageBox.Show("没有发生死锁,没有进程号被干掉!"); }
}