如何将表名传递给SqlCommand?

我试图通过SqlCommand将表名作为参数传递给我的查询但它似乎没有工作。 这是我的代码;

 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 ,而不支持数据定义语言操作。

即使您使用DML,也无法参数化您的表名或列名等。 您只能参数化您的值

数据操作语言=

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

数据定义语言=

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

您不能将DROP语句与参数一起使用。

如果您真的必须使用drop语句,则可能需要在SqlCommand上使用字符串连接。 (注意SQL注入 )您可能需要查看名为Dynamic SQL的术语

也可以使用using语句来配置你的SqlConnectionSqlCommand类的;

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

用户SonerGönül指出了为什么它不起作用,但你可以自己编写存储过程。

 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 

这个问题的代码。