遇到SQL和C#的麻烦

时间:2012-02-09 13:23:02

标签: c# sql-server sql-server-ce

我正在尝试修改数据库中的表,如下所示:

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]

4 个答案:

答案 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要插入的表的名称不能参数化。