您好我正在尝试创建一个从数据库中读取数据的通用方法。这就是我目前所拥有的:
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”。
如何更正此问题?
答案 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)