簡體   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