C# SQL和C有问题吗#
我正在尝试修改数据库中的表,如下所示:C# SQL和C有问题吗#,c#,sql-server,sql-server-ce,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.Paramet
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,令牌
行偏移量=13,令牌出错=@hostname2]
不能使用参数更改表名。对于这一部分,您将需要使用动态SQL。您不能使用参数更改表名。对于该部分,您将需要使用动态SQL。就像在“普通”SQL中一样,要插入的表的名称不能参数化。就像在“普通”SQL中一样,要插入的表的名称不能参数化。更改如下代码:
new SqlCeCommand(String.Format("INSERT INTO {0}RamResults (Result, Date) VALUES(@num, @date)", hostname2), con))
然后不要再传递/设置@hostname2参数。SQL参数与动态SQL生成不同 如下更改代码:
new SqlCeCommand(String.Format("INSERT INTO {0}RamResults (Result, Date) VALUES(@num, @date)", hostname2), con))
然后不要再传递/设置@hostname2参数。SQL参数与动态SQL生成不同 如果您使用这样的预先准备好的语句,
@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注入。如果使用这样的预处理语句,
@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参数(即@
)。我甚至不打算建议使用字符串连接来做同样的事情。不幸的是,虽然不会建议这样做,但实际上这是唯一的答案。然而,我同意恶心-这个问题应该从另一个角度来解决。例如,为什么需要动态表名前缀?