Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL和C有问题吗#_C#_Sql Server_Sql Server Ce - Fatal编程技术网

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参数(即
@
)。我甚至不打算建议使用字符串连接来做同样的事情。不幸的是,虽然不会建议这样做,但实际上这是唯一的答案。然而,我同意恶心-这个问题应该从另一个角度来解决。例如,为什么需要动态表名前缀?