2012-02-09 204 views
1

我試圖在數據庫中修改一個表,如下所示:有麻煩與SQL和C#

using (SqlCeCommand com = new SqlCeCommand("INSERT INTO RamResults(Result, Date) VALUES(@num, @date)", con)) 
{ 
    com.Parameters.AddWithValue("@num", num); 
    com.Parameters.AddWithValue("@hostname2", hostname2); 
    com.Parameters.AddWithValue("@date", Form1.date); 
    com.ExecuteNonQuery(); 
} 

雖然表名具有可變前綴(主機名2)。所以我試圖做到以下幾點:

("INSERT INTO @hostname2 + RamResults(Result, Date) VALUES(@num, @date)", con)) 

但沒有運氣,任何人有任何想法來解決這個問題?

錯誤消息:

有解析查詢錯誤。 [令牌行號= 1,令牌 行偏移= 13,令牌出錯= @主機名2]

+5

您不能爲表名使用SQL參數(即'@')。而且我甚至不會建議字符串連接來做同樣的事情。 – Yuck 2012-02-09 13:24:40

+2

不幸的是,雖然它不會被建議它實際上是唯一的答案。不過,我同意尤克 - 這個問題應該從另一個角度來解決。例如,爲什麼你需要動態表名前綴? – 2012-02-09 13:26:20

回答

3

如果您使用像這樣的預處理語句,@hostname2將被替換爲'value'
您應該使用string.Format()代替:

string hostprefix = 'host2_'; // example 
string sql = string.Format("INSERT INTO {0}RamResults(Result, Date) "+ 
          " VALUES(@num, @date)", hostprefix); 
using (SqlCeCommand com = new SqlCeCommand(sql, con)) 
// .... 

,但只有使用的String.format爲您hostprefix,而不是用戶的輸入!這樣你可以防止SQL注入。

0

您不能使用參數改變表名。對於那部分,你將需要使用動態SQL。

0

就像在「正常」的SQL中,要插入的表的名稱不能被參數化。

1

改變這樣的代碼:

new SqlCeCommand(String.Format("INSERT INTO {0}RamResults (Result, Date) VALUES(@num, @date)", hostname2), con)) 

然後不及格/設置@主機名2的參數了。 SQL參數與動態SQL生成不同...