我需要从指定的表中检索所有数据,并且我不需要对数据进行强类型化,因此我将其作为数据表返回。
public DataTable GetByTypeName(String t)
{
var type = Type.GetType(t);
var dt = new DataTable();
using (var sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["MasterPlanConnectionString"].ConnectionString))
{
var sqlComm = new SqlCommand("SELECT * FROM @table", sqlConn);
sqlComm.Parameters.AddWithValue("@table", type.Name);
sqlConn.Open();
var dr = sqlComm.ExecuteReader(CommandBehavior.CloseConnection);
dt.Load(dr);
}
return dt;
}
当我运行此操作时,我收到错误
System.Data.SqlClient.SqlException was unhandled by user code
Message=Must declare the table variable "@table".
我无法弄清楚为什么这不起作用,因为我已宣布@table。我知道这种方法对一些糟糕的sql攻击是开放的,所以我打算添加一些保护,确切地说可以查询哪些类型。
答案 0 :(得分:3)
您可以动态构建查询 - (这里应该没问题,但可能会将您的查询暴露给sql注入)
var query = String.Fromat("Select * from [{0}]", type.Name);
var sqlComm = new SqlCommand(query, sqlConn);
/*sqlComm.Parameters.AddWithValue("@table", type.Name);*/