2

您好我正在尝试创建一个从数据库读取数据的通用方法。这是我到目前为止所拥有的:

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

4 回答 4

3

您不能用参数化查询替换数据库对象(表、列、视图等)名称。你只能通过串联来做到这一点。

string commandText = String.Format("SELECT {0}, {1} FROM {2}", key, value, tableName);
于 2013-07-04T09:17:59.813 回答
1

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

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

于 2013-07-04T09:16:26.807 回答
0

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

您将不得不使用string.Format或类似的东西来实现您的目标。

类似问题:表名作为变量

于 2013-07-04T09:20:58.090 回答
0

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

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

于 2013-07-04T09:17:06.543 回答