C# - 使用变量作为MySQL表名

时间:2014-07-12 19:10:11

标签: c# mysql sql variables

我想使用变量并将此值作为表名的一部分传递给SQL语句,但是,我不确定我使用的方法是否安全(即使它有效) 。如果没有,我应该怎么做呢?

    string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
    MySqlConnection conn = new MySqlConnection(connStr);
    string table = "1";
    MySqlCommand comm = new MySqlCommand("INSERT INTO " + table + "_tests (user_id, score, time) VALUES (@user_id, @score, @time)", conn);
    comm.Parameters.Add("@user_id", MySqlDbType.VarChar);
    comm.Parameters["@user_id"].Value = "2";
    comm.Parameters.Add("@score", MySqlDbType.VarChar);
    comm.Parameters["@score"].Value = txtScore.ToString();
    comm.Parameters.Add("@time", MySqlDbType.VarChar);
    comm.Parameters["@time"].Value = txtTime.ToString();

更新:

    int tableID = Convert.ToInt32(Session["TestModuleID"].ToString());
    MySqlCommand comm = new MySqlCommand("INSERT INTO " + tableID.ToString() + "_tests (user_id, score, time) VALUES (@user_id, @score, @time)", conn);

1 个答案:

答案 0 :(得分:2)

你说的是正确的。您可能已经猜到了,您不能使用参数作为表名。

您的代码引发的安全问题可以通过将table变量重新声明为整数来删除,就像这样......

int table = 1;
MySqlCommand comm = new MySqlCommand (
       "INSERT INTO " + table.ToString() +   
       "_tests (user_id, score, time) VALUES (@user_id, @score, @time)", conn);

这将使任何非数字不会进入您的查询。还有其他方法可以控制table变量的值。