其中子句引发错误

本文关键字:错误 子句 | 更新日期: 2023-09-27 18:19:13

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

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();
    }
}

其中子句引发错误

与其

忘记' Brugernavn列的值和Dato列的两个单引号,我认为您还有更多的事情要记住。

  • 使用 using 语句释放 Command 对象,就像对连接所做的那样,而不是手动调用CloseDispose方法。
  • 使用参数化查询而不是字符串串联。这种代码对SQL注入攻击是开放的。
  • 看起来您尝试使用字符串表示形式保存DateTime值。不要那样做!如果要将DateTime值保留到数据库中,则需要直接传递它们。将Dato列更改为DateTime类型。阅读:踢坏习惯:选择错误的数据类型
<小时 />
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();
}

您在Brugernavn =Dato之后'错过了一个引号:

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

此外,我强烈建议您始终使用参数化查询来避免像这样进行SQL注入:

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

尽管直接指定类型并使用 Value 属性比 AddWithValue 更好。检查一下:我们可以停止使用AddWithValue((吗?