为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"。
我该如何更正这个问题?
不能用参数化查询替换数据库对象(表、列、视图等)的名称。你只能通过串联来完成。
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
或类似的东西来实现你的目标。
类似的问题:表名作为变量