为tableName创建参数导致异常

本文关键字:异常 参数 tableName 创建 | 更新日期: 2023-09-27 18:21:12

嗨,我正在尝试创建一个从数据库读取数据的通用方法。以下是我目前所拥有的:

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"。

我该如何更正这个问题?

为tableName创建参数导致异常

不能用参数化查询替换数据库对象(表、列、视图等)的名称。你只能通过串联来完成。

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

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

尽管这样,它将容易受到sql注入的攻击。但我猜您并没有从用户输入中获得表名,而且您团队中的开发人员也不像那些偶尔会键入'fake]; delete everything!!!' 的人

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

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

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

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

类似的问题:表名作为变量