2016-07-25 5 views
0

Je suis en train de tuer une session dans SQL Server 2012 à partir de C# Windows Form en utilisant kill <spid> mais ce qui se passe est que quand je fais ça, une erreur apparaît:Comment tuer une session SQL Server ou ID de session

ne peut pas utiliser KILL pour tuer votre propre processus

code:

// 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(); 
     } 
    } 
} 
+4

Vous avez [base de données nommée 'school' et vous construisez des commandes SQL avec concaténation de chaînes] (http://stackoverflow.com/q/332365/11683) ... – GSerg

+0

Copie possible de [C# sql à éliminer] (http://stackoverflow.com/questions/1158665/c-sharp-sql-what-to-dispose) – GSerg

Répondre

0

"Impossible d'utiliser KILL pour tuer votre propre processus" est là pour une raison. Si vous avez fini d'utiliser votre session, fermez la connexion: SqlConnection est un IDisposable, alors l'emballer dans un bloc le fermera automatiquement quand vous aurez fini de l'utiliser. Cela renverra la poignée de connexion au pool, et il appartient aux composants du client SQL Server de décider s'il faut les conserver pour les connexions de suivi ou les éliminer. SQL Server fait un bon travail de gestion de son cycle de vie des processus et les tuer est une option administrative, mais rien qu'une application en fonctionnement normal devrait faire (sauf pour quelques raisons, voir here)

Cela dit, pour répondre à la réelle question: pour tuer le processus A, vous devez ouvrir une deuxième connexion B et KILL A processus (SPID). Cela fonctionnera tant que l'hypothèse "un SPID = une connexion = une session" est vraie (vrai pour toutes les versions actuelles du serveur SQL). De plus, votre utilisateur a besoin du privilège ALTER ANY CONNECTION. Cela est généralement limité aux rôles sysadmin et processadmin, et il est peu probable que votre application ait cela dans un environnement de production.

Références:

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

1

Utilisez toujours "à l'aide" pour les classes à usage unique (également de fermer et d'en disposer), jamais concaténer chaîne dans la requête, utilisez toujours requête paramétrées pour éviter sql injection. Ceci est exemple comment utiliser SqlConnection, SqlDataAdapter et 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); 
    }