【问题标题】:How can I Pass a Table Name to SqlCommand?如何将表名传递给 SqlCommand?
【发布时间】:2014-06-14 23:12:41
【问题描述】:

我试图通过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( );

【问题讨论】:

    标签: c# ado.net sqlcommand


    【解决方案1】:

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

    【讨论】:

    • 这实际上并不是 DML 与 DDL 的问题:在 SELECT 语句中插入表名或列名同样会有问题。 SQL 参数仅限于可以在 SQL 中放置变量的地方,并且在引用数据库对象时不能使用变量。
    【解决方案2】:

    用户Soner Gö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的代码。

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 2011-09-20
      • 2011-05-02
      • 2011-07-17
      • 1970-01-01
      • 2019-02-12
      相关资源
      最近更新 更多