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 .