如何将表名传递给SqlCommand?

时间:2014-04-29 06:50:11

标签: c# ado.net 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( );

2 个答案:

答案 0 :(得分:8)

SqlCommand.Parameters 操作支持

Data manipulation language而不是 Data definition language 操作。

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

数据操作语言=

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

数据定义语言=

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

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

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

的术语

同时使用using statement来处理您的SqlConnectionSqlCommand之类的内容;

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

答案 1 :(得分:2)

用户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

来自this question的代码。