2012-12-22 95 views
6

我是C#和SQL的初學者,我有這個SQL插入語句,我想執行。它要求我想要插入的其他變量中的表名。必須聲明表變量@table

但是當我運行該控制檯應用程序,我得到這個錯誤:

必須聲明表變量@table

這是代碼的一部分:

StreamReader my_reader = getFile(args); 
string CS = formCS(); 
try 
{ 
    using (SqlConnection con = new SqlConnection(CS)) 
    { 
     SqlCommand com = new SqlCommand("insert into @table (time, date, pin) values (@time, @date, @pin)", con);      
     con.Open(); 
     Console.WriteLine("Enter table name:"); 
     Console.Write(">> "); 
     string tblname = Console.ReadLine(); 
     com.Parameters.AddWithValue("@table", tblname); 

     string line = ""; 
     int count = 0; 
     while ((line = my_reader.ReadLine()) != null) 
     { 
      Dictionary<string, string> result = extractData(line);       
      com.Parameters.AddWithValue("@time", result["regTime"]); 
      com.Parameters.AddWithValue("@date", result["regDate"]); 
      com.Parameters.AddWithValue("@pin", result["regPin"]); 
      count += com.ExecuteNonQuery(); 
      com.Parameters.Clear();       

     } 
     Console.WriteLine("Recoreds added : {0}", count.ToString()); 
     Console.WriteLine("Press Enter to exit."); 
    } 
    Console.ReadLine(); 
} 
catch (SqlException ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message);     
} 
+5

不允許插入statememt的表名作爲變量。查看sp_exec是否需要類似這一點。 – rene

回答

11

你不能這樣做。你無法通過表名作爲參數,你所做的一切:

SqlCommand com = new SqlCommand("insert into @table ..."); 
... 
com.Parameters.AddWithValue("@table", tblname); 

你可以這樣做,而不是:

Console.WriteLine("Enter table name:"); 
Console.Write(">> "); 
string tblname = Console.ReadLine(); 

string sql = String.Format("insert into {0} (time, date, pin) values ... ", tblname); 

SqlCommand com = new SqlCommand(sql, con);      

... 
+3

這是否允許任何方式的SQL注入? –

+3

@RafaelAdel是的。你應該檢查'tblname'是否是數據庫中的一個表('SELECT * FROM INFORMATION_SCHEMA.TABLES')。 – ctusch

+2

@RafaelAdel,我查看[和]的表名。如果它包含或者然後停止。然後將表格名稱放在[]中。 –

4

表名不能在一個SQL查詢的輸入參數。但是,您可以隨時「它傳遞給SqlCommand之前準備SQL字符串如下:

var sqlString = string.Format("insert into {0} (time, date, pin) values (@time, @date, @pin)", tblname) 

然後

SqlCommand com = new SqlCommand(sqlString); 
...