C# 为tableName创建参数会导致异常

C# 为tableName创建参数会导致异常,c#,ado.net,C#,Ado.net,您好,我正在尝试创建一个从数据库读取数据的通用方法。以下是我迄今为止所做的: private static void GetData(string tableName, string key, string values) { string connectionString = "data source=DB03RO;initial catalog=NCOI_Dev;User ID=NCOI_Olympus;Password=Olympus;persist securit

您好,我正在尝试创建一个从数据库读取数据的通用方法。以下是我迄今为止所做的:

private static void GetData(string tableName, string key, string values)
    {
        string connectionString = "data source=DB03RO;initial catalog=NCOI_Dev;User ID=NCOI_Olympus;Password=Olympus;persist security info=False;packet size=4096;Enlist=true;Transaction Binding=Explicit Unbind;";
        string commandText = @"SELECT @key , @value FROM @Name";
        SqlDataReader reader = null;

        using (var connection = new SqlConnection(connectionString))
        using (var cmd = new SqlCommand())
        {
            connection.Open();
            cmd.Connection = connection;
            cmd.Parameters.Add(new SqlParameter("@Name", tableName));
            cmd.Parameters.Add(new SqlParameter("@key", key));
            cmd.Parameters.Add(new SqlParameter("@value", values));
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = commandText;
            reader = cmd.ExecuteReader();

            while (reader != null)
            {
                string id = (string)reader[key];
                string data = (string)reader[values];
                Console.WriteLine(id + " " + data);
            }
        }
    }
当我试图执行读卡器时,我似乎遇到了一个错误:

必须声明表变量@Name


如何更正此问题?

否,不能参数化表名。 您只需要使用string.FormatSELECT@key,[{0}]中的@value],tableName

尽管如此,它还是容易受到sql注入的攻击。
但我猜你不是从用户输入中得到表名的,你团队中的开发人员也不像偶尔会输入“假”的人;删除所有内容!!!'

否,不能参数化表名。 您只需要使用string.FormatSELECT@key,[{0}]中的@value],tableName

尽管如此,它还是容易受到sql注入的攻击。 但我猜你不是从用户输入中得到表名的,你团队中的开发人员也不像偶尔会输入“假”的人;删除所有内容!!!'

我不是SQL方面的专家,但据我所知,您不能在查询中参数化表名。你应该使用其他的机制

使用简单的string.Format{0},强制控制传递的参数的有效性

我不擅长SQL,但据我所知,您不能在查询中参数化表名。你应该使用其他的机制


使用简单的string.Format{0},强制控制传递的参数的有效性

不能用参数化查询替换数据库对象表、列、视图等名称。您只能通过连接来完成

string commandText = String.Format("SELECT {0}, {1} FROM {2}", key, value, tableName);

不能用参数化查询替换数据库对象表、列、视图等名称。您只能通过连接来完成

string commandText = String.Format("SELECT {0}, {1} FROM {2}", key, value, tableName);

对象名称在TSQL中必须是静态的

您必须使用string.Format或类似的东西来实现您的目标


类似的问题:

对象名称在TSQL中必须是静态的

您必须使用string.Format或类似的东西来实现您的目标


类似的问题:

除了下面的答案之外,依赖DataAdapter或SqlDataAdapter来填充表格可能会有帮助除了下面的答案之外,依赖DataAdapter或SqlDataAdapter来填充表格可能会有帮助