2011-05-13 40 views
0

我需要從指定表中獲取所有數據,並且我不需要強類型數據,因此我將它作爲數據表返回。從變量表中獲取數據並返回爲數據表c#

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攻擊是開放的,因此我打算加入一些保護措施,確切地說可以查詢哪些類型。

回答

3

您可以構建動態查詢 - (應該是在這裏確定,但可能會使您的查詢SQL注入)

 var query = String.Fromat("Select * from [{0}]", type.Name); 
     var sqlComm = new SqlCommand(query, sqlConn); 
     /*sqlComm.Parameters.AddWithValue("@table", type.Name);*/ 
+0

+1。像往常一樣,簡單的解決方案最好! – 2011-05-13 02:44:46

+0

+1 OP的嘗試方式將永遠不會工作,因爲這不是參數的工作方式 – 2011-05-13 02:54:35

+0

乾杯,希望通過確保類型必須實現特定的接口來緩解sql注入,最壞的情況下您可以查看用於不同審計的審計數據表格比指定 – 2011-05-13 03:01:04