【问题标题】:Where clause throws error [closed]Where子句抛出错误[关闭]
【发布时间】:2015-10-25 15:05:57
【问题描述】:

为什么这段代码会抛出错误?

using (MySqlConnection cn = new MySqlConnection(VarribleKeeper.MySQLConnectionString))
{
    {
        MySqlCommand Command = new MySqlCommand();
        Command.Connection = cn;

        Command.CommandText = "UPDATE TeleworksStats SET Ja= ('" + JaTak +
            "') WHERE Brugernavn = " + VarribleKeeper.Brugernavn + "' AND Dato = " +
            DateTime.Today.ToString("yyyy-MM-dd") + "";
        cn.Open();
        Command.ExecuteNonQuery();
        //Ryd op
        Command.Dispose();
        cn.Close();
    }
}

【问题讨论】:

  • 添加第二个where子句时出现问题错误
  • 这段代码看起来容易受到SQL Injection Exploits 的攻击。您应该使用 SQL 参数。
  • int JaTak = 0; JaTak++;
  • @user3922197 嗯,你的评论是什么意思?
  • 通常对 Exception 最好的办法就是阅读它,它是怎么说的:)。

标签: c# mysql sql


【解决方案1】:

我认为您要记住的不仅仅是'Brugernavn 列的值和两个单引号Dato 列的值。


using(var cn = new MySqlConnection(VarribleKeeper.MySQLConnectionString))
using(var Command = cn.CreateCommand())
{
   Command.CommandText = @"UPDATE TeleworksStats SET Ja = @Ja 
                           WHERE Brugernavn = @Brugernavn  AND Dato = @Dato";
   Command.Parameters.Add("@Ja", MySqlDbType.VarChar).Value = JaTak;
   Command.Parameters.Add("@Ja", MySqlDbType.VarChar).Value = VarribleKeeper.Brugernavn;
   Command.Parameters.Add("@Ja", MySqlDbType.DateTime).Value = DateTime.Today;
   // I assumed your column types. You should write proper column types instead.

   cn.Open();
   Command.ExecuteNonQuery();
}

【讨论】:

    【解决方案2】:

    Brugernavn =Dato 之后,您错过了' 的引用:

    Brugernavn = "... '" + VarribleKeeper.Brugernavn + "' AND Dato = '" +
                 DateTime.Today.ToString("yyyy-MM-dd") + "'";
    

    此外,我强烈建议您始终使用parameterized queries 来避免像这样使用SQL Injection

    Command.CommandText =
         "UPDATE TeleworksStats SET Ja = @Ja WHERE Brugernavn = @Brugernavn and ...";
    Command.Parameters.AddWithValue("@Ja", JaTak);
    Command.Parameters.AddWithValue("@Brugernavn",  VarribleKeeper.Brugernavn);
    

    虽然直接指定类型并使用Value属性比AddWithValue好。检查这个:Can we stop using AddWithValue() already?

    【讨论】:

    • 这只是测试代码,所以忽略安全性
    • Brugernavn = '" + VarribleKeeper.Brugernavn + "' 有效!!!但现在我的 jatak++ 不起作用
    • 它应该是+每次按钮被点击,问题是它现在不+:/?
    • 感谢 user2946329!我知道这是一件小事,但我就是找不到问题。
    • @user3922197...答案旁边有复选标记,只需点击它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 2021-01-16
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多