[英]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.