繁体   English   中英

如何终止SQL Server会话或会话ID

[英]How to kill a SQL Server session or session ID

我正在尝试使用kill <spid>从C#Windows Form kill <spid> SQL Server 2012中的会话,但是发生的是,当我这样做时,出现错误:

无法使用KILL杀死自己的进程

码:

// to do DB backup
private void spid2_Click(object sender, EventArgs e)
{
    string SQLDataBases;
    SQLDataBases = "select @@spid ";
    SQLDataBases += "BACKUP DATABASE School TO DISK = \'C:\\Program Files\\Microsoft SQL Server\\MSSQL11.MSSQLSERVER\\MSSQL\\Backup\\AdventureWorks333.BAK\' ";
    string svr = "Server=" + localsrv + ";Initial Catalog=master;Integrated Security = SSPI;";

    SqlConnection cnBk = new SqlConnection(svr);
    Command = new SqlCommand(SQLDataBases, cnBk);
    Command.CommandText = SQLDataBases;

    SqlDataAdapter da = new SqlDataAdapter(Command);
    DataTable dtDatabases = new DataTable();

    try
    {
        cnBk.Open();
        da.Fill(dtDatabases);
        label1.Text = dtDatabases.Rows[0][0].ToString();
    }
    catch (Exception ex)
    {
        string s = ex.ToString();
        MessageBox.Show(s);
        label1.Text = dtDatabases.Rows[0][0].ToString();
    }
    finally
    {
        if (cnBk.State == ConnectionState.Open)
        {
            cnBk.Close();
            cnBk.Dispose();                   
        }
    }
}

// to kill backup session
private void kill_Click(object sender, EventArgs e)
{
    string SQLRestor;

    SQLRestor = "Use master; kill " + label1.Text;
    string svr = "Server=" + localsrv + ";Initial Catalog=master;Integrated Security = SSPI;";

    SqlConnection cnRestore = new SqlConnection(svr);
    SqlCommand cmdBkUp = new SqlCommand(SQLRestor, cnRestore);

    try
    {
        cnRestore.Open();
        cmdBkUp.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        string s = ex.ToString();
    }
    finally
    {
        if (cnRestore.State == ConnectionState.Open)
        {
            cnRestore.Close();
            cnRestore.Dispose();
        }
    }
}

始终对一次性类使用“ using”(也用于关闭和处置), 不要在查询中连接字符串 ,请始终使用参数化查询以避免sql注入。 这是如何使用SqlConnection,SqlDataAdapter和SqlCommand的示例:

  var connectionString = "...";
  var sqlQuery = "...";

  // Sample using SqlCommand
  try
  {
    using (var conn = new SqlConnection(connectionString))
    {
      conn.Open();
      using (var cmd = new SqlCommand(sqlQuery, conn))
      {
        cmd.ExecuteNonQuery();
      }
    }
    MessageBox.Show("OK, SqlConnection and SqlCommand are closed and disposed properly");
  }
  catch (Exception ex)
  {
    MessageBox.Show("Error : " + ex);
  }

  // Sample using SqlDataAdapter
  try
  {
    var dataTable = new DataTable();
    using (var conn = new SqlConnection(connectionString))
    {
      conn.Open();
      using (var sda = new SqlDataAdapter(sqlQuery, conn))
      {
        sda.Fill(dataTable);
      }
    }
    MessageBox.Show("OK, SqlConnection and SqlDataAdapter are closed and disposed properly, use DataTable here...");
  }
  catch (Exception ex)
  {
    MessageBox.Show("Error : " + ex);
  }

出现“无法使用KILL杀死自己的进程”是有原因的。 如果您已完成会话的使用,请关闭连接: SqlConnection是一个IDisposable ,因此将其包装在using() {}块中后,将在using() {}完毕后自动将其关闭。 这会将连接句柄返回到池中,并且由SQL Server客户端组件决定是否保留它以进行后续连接,还是将其处置。 SQL Server在管理其进程生命周期方面表现出色,并且杀死它们是一个管理选项,但是处于正常运行状态的应用程序不应该执行任何操作(出于某些原因,请参见此处

也就是说,要回答实际问题:要杀死进程A,您必须打开第二个连接B和KILL A的进程(SPID)。 只要假设“一个SPID =一个连接=一个会话”成立(对于所有当前SQL Server版本为true),这将起作用。 此外,您的用户需要ALTER ANY CONNECTION特权。 这通常仅限于sysadmin和processadmin角色,并且您的应用程序不太可能在生产环境中具有此角色。

参考文献:

http://www.sqlservercentral.com/Forums/Topic1503836-1292-1.aspx http://sqlserverplanet.com/dba/spid-what-is-it

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM