我正在尝试修改数据库中的表,如下所示:
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();
}
虽然表名有一个变量前缀(hostname2)。所以我试图做到以下几点:
("INSERT INTO @hostname2 + RamResults(Result, Date) VALUES(@num, @date)", con))
但没有运气,任何人都有任何想法来解决这个问题?
错误消息:
解析查询时出错。 [令牌行号= 1,令牌 line offset = 13,Token in error = @ hostname2]
答案 0 :(得分: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))
// ....
但是只为你的hostprefix使用string.Format,而不是用户输入!这样就可以防止SQL注入。
答案 1 :(得分:1)
更改代码如下:
new SqlCeCommand(String.Format("INSERT INTO {0}RamResults (Result, Date) VALUES(@num, @date)", hostname2), con))
然后不再传递/设置@ hostname2参数。 SQL参数与动态SQL生成不同...
答案 2 :(得分:0)
您不能使用参数更改表名称。对于该部分,您将需要使用动态SQL。
答案 3 :(得分:0)
就像" normal" SQL要插入的表的名称不能参数化。