Comment puis-je passer un nom de table à SqlCommand?

J’essaie de passer un nom de table en tant que paramètre à ma requête via SqlCommand mais cela ne semble pas fonctionner. Voici mon code;

 SqlConnection con = new SqlConnection( "server=.;user=sa;password=12345;database=employee" ); con.Open( ); SqlCommand cmd = new SqlCommand( "drop table @tbName" , con ); cmd.Parameters.AddWithValue( "@tbName" , "SampleTable" ); cmd.ExecuteNonQuery( ); con.Close( ); 

SqlCommand.Parameters sont pris en charge pour les opérations du langage de manipulation de données et non les opérations du langage de définition de données .

Même si vous utilisez DML, vous ne pouvez pas paramétrer vos noms de table ni vos noms de colonnes, etc. Vous ne pouvez paramétrer que vos valeurs .

Langage de manipulation de données =

 SELECT ... FROM ... WHERE ... INSERT INTO ... VALUES ... UPDATE ... SET ... WHERE ... DELETE FROM ... WHERE ... 

Langage de définition de données =

 CREATE TABLE ... DROP TABLE ... ; ALTER TABLE ... ADD ... INTEGER; 

Vous ne pouvez pas utiliser l’ instruction DROP avec des parameters.

Si vous devez vraiment utiliser l’instruction drop, vous devrez peut-être utiliser la concaténation de chaînes sur votre commande SqlCommand . (Faites attention à l’ injection SQL ) Vous devrez peut-être jeter un coup d’œil au terme appelé SQL dynamic.

Également utiliser une instruction using pour disposer votre SqlConnection et SqlCommand comme;

 using(SqlConnection con = new SqlConnection(ConnectionSsortingng)) using(SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = "drop table " + "SampleTable"; con.Open() cmd.ExecuteNonQuery(); } 

Soner Gönül a expliqué pourquoi cela ne fonctionne pas. Néanmoins, vous pouvez écrire une procédure stockée vous-même.

 CREATE PROCEDURE dbo.procdroptable @TABLENAME SYSNAME AS BEGIN SET NOCOUNT ON; DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = 'DROP TABLE dbo.' + QUOTENAME(@TABLENAME) + ''; EXEC sp_executesql @SQL; END GO 

Code de cette question .