为tableName创建参数会导致异常

时间:2013-07-04 09:12:13

标签: 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 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”。

如何更正此问题?

4 个答案:

答案 0 :(得分:3)

您不能使用参数化查询替换数据库对象(表,列,视图等)。你只能连接它。

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

答案 1 :(得分:1)

不,您不能参数化表名。 你宁愿只使用string.Format("SELECT @key , @value FROM [{0}]", tableName);

虽然这种方式很容易受到sql注入的攻击。 但是我猜你没有从用户输入得到表名,你团队中的开发人员不像那些偶尔可以输入'fake]; delete everything!!!'

的人

答案 2 :(得分:0)

我不是SQL的专家,但据我所知,您无法在查询中参数化的名称。你应该使用其他一些机制。

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

答案 3 :(得分:0)

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

您必须使用string.Format或类似内容来实现目标。

类似的问题:Table name as variable