有麻烦与SQL和C#
问题描述:
我试图在数据库中修改一个表,如下所示:有麻烦与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]
答
如果您使用像这样的预处理语句,@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注入。
答
您不能使用参数改变表名。对于那部分,你将需要使用动态SQL。
答
就像在“正常”的SQL中,要插入的表的名称不能被参数化。
答
改变这样的代码:
new SqlCeCommand(String.Format("INSERT INTO {0}RamResults (Result, Date) VALUES(@num, @date)", hostname2), con))
然后不及格/设置@主机名2的参数了。 SQL参数与动态SQL生成不同...
您不能为表名使用SQL参数(即'@')。而且我甚至不会建议字符串连接来做同样的事情。 – Yuck 2012-02-09 13:24:40
不幸的是,虽然它不会被建议它实际上是唯一的答案。不过,我同意尤克 - 这个问题应该从另一个角度来解决。例如,为什么你需要动态表名前缀? – 2012-02-09 13:26:20