C# 从变量表中获取数据并作为datatable c返回#

C# 从变量表中获取数据并作为datatable c返回#,c#,sql,ado.net,parameterized,C#,Sql,Ado.net,Parameterized,我需要检索指定表中的所有数据,并且我不需要强类型的数据,所以我将它作为数据表返回 public DataTable GetByTypeName(String t) { var type = Type.GetType(t); var dt = new DataTable(); using (var sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Mas

我需要检索指定表中的所有数据,并且我不需要强类型的数据,所以我将它作为数据表返回

public DataTable GetByTypeName(String t)
    {
        var type = Type.GetType(t);

        var dt = new DataTable();

        using (var sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["MasterPlanConnectionString"].ConnectionString))
        {
            var sqlComm = new SqlCommand("SELECT * FROM @table", sqlConn);
            sqlComm.Parameters.AddWithValue("@table", type.Name);

            sqlConn.Open();

            var dr = sqlComm.ExecuteReader(CommandBehavior.CloseConnection);

            dt.Load(dr);
        }

        return dt;
    }
当我运行这个时,我得到了错误

System.Data.SqlClient.SqlException was unhandled by user code
Message=Must declare the table variable "@table".

我无法理解为什么我已经声明@table,但它不起作用。我知道这种方法会受到一些糟糕的sql攻击,所以我计划添加一些保护,以确切说明可以查询哪些类型。

您可以动态构造查询-(此处应该可以,但可能会将查询暴露给sql注入)


您可以动态构造查询-(在这里应该可以,但可能会将查询暴露给sql注入)


+1 OP尝试的方式永远不会起作用,因为这不是参数工作的方式,希望通过确保类型必须实现特定的接口来减轻sql注入,最坏情况下,您可以查看与指定不同的审核表的审核数据+1 OP尝试的方式永远不会起作用,因为参数不是这样工作的,所以通过确保该类型必须实现特定的接口,很可能已经减轻了sql注入的影响。在最坏的情况下,您可以查看与指定的审计表不同的审计数据
        var query = String.Fromat("Select * from [{0}]", type.Name);
        var sqlComm = new SqlCommand(query, sqlConn);
        /*sqlComm.Parameters.AddWithValue("@table", type.Name);*/