2012-02-09 95 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生成不同...