【问题标题】:c# Insert data into MySQL database using parametersc# 使用参数将数据插入MySQL数据库
【发布时间】:2015-06-23 19:47:24
【问题描述】:

这可能是一个简单的解决方案,但我有一个截止日期要赶上,我不知道这里的确切问题。 所以这是交易,我正在尝试使用这段代码更新我的表:

    private void btn_opslaan_Click(object sender, EventArgs e)
    {
        string opleidingsid = "Select OpleidingsID From opleidingen Where Opleidingsnaam = '" + cb_opleiding.Text + "'";
        MySqlCommand cmdid = new MySqlCommand(opleidingsid, dbconnect.connection);
        dbconnect.OpenConnection();
        MySqlDataReader reader = cmdid.ExecuteReader();
        reader.Read();
            int oplid = (int)reader.GetValue(0);

        cmdid.Dispose();
        reader.Close();
        sql = "UPDATE leerlingen SET Naam = '_naam', Adres = '_adres', Woonplaats = '_woonplaats', Postcode = '_postcode', Email = '_email', Telefoonnummer = '_telefoonnummer', Klas = '_klas', Ovnummer = '_ovnummer', OpleidingsID = '_opleidingsid', Startdatum = '_startdatum', Einddatum = '_einddatum' WHERE LeerlingID = '_leerlingid'";

      //  sql = "UPDATE leerlingen set Naam  = '" + txt_naam.Text + "', Adres = '" + txt_adres.Text + "', Woonplaats = '" + txt_woonplaats.Text + "', Postcode = '" + txt_postcode.Text + "', Email = '" + txt_email.Text + "', Telefoonnummer = '" + txt_telefoonnumer.Text + "', Klas = '" + txt_klas.Text + "', Ovnummer = '" + txt_ovnummer.Text + "', OpleidingsID = '" + oplID + "', Startdatum = '"+mc_startdatum.SelectionStart.Date.ToString()+"', Einddatum = '"+ mc_einddatum.SelectionStart.Date.ToString() +"' WHERE LeerlingID = '" + Int32.Parse(lbl_leerlingid.Text) + "'";
        MySqlCommand cmd = new MySqlCommand(sql, dbconnect.connection);

        cmd.Parameters.AddWithValue("_naam", txt_naam.Text);
        cmd.Parameters.AddWithValue("_adres", txt_adres.Text);
        cmd.Parameters.AddWithValue("_woonplaats", txt_woonplaats.Text);
        cmd.Parameters.AddWithValue("_postcode", txt_postcode.Text);
        cmd.Parameters.AddWithValue("_email", txt_email.Text);
        cmd.Parameters.AddWithValue("_telefoonnummer", txt_telefoonnumer.Text);
        cmd.Parameters.AddWithValue("_klas", txt_klas.Text);
        cmd.Parameters.AddWithValue("_ovnummer", txt_ovnummer.Text);
        cmd.Parameters.AddWithValue("_opleidingsid", oplid);
        cmd.Parameters.AddWithValue("_startdatum", mc_startdatum.SelectionStart.Date.ToString());
        cmd.Parameters.AddWithValue("_einddatum", mc_einddatum.SelectionStart.Date.ToString());
        cmd.Parameters.AddWithValue("_leerlingid", int.Parse(lbl_leerlingid.Text));

        try
        {
            cmd.ExecuteNonQuery();
            MessageBox.Show("opslaan gelukt");
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
            throw;
        }
        dbconnect.CloseConnection();

        this.Close();

    }

我已经尝试过不使用单引号,它会给我列'_leerlingid'不存在的错误,但那是参数...... 现在,我没有收到任何错误,但它不会更新我的数据库。 请帮忙

附:请忽略sql注入,在此之前,我没有更好地了解参数。

【问题讨论】:

  • 只是好奇 - 如果您使用这个注释掉的查询,它容易受到 SQL 注入的攻击,您是否得到了您需要的行为?
  • @dotnetcom 是的,但对于我的任务,我必须使用参数
  • 在您的WHERE 条件中,您在参数周围有引号:WHERE LeerlingID = '_leerlingid'。这似乎是唯一的整数参数,因此不需要引号。尝试删除这些引号。我只是在这里猜测,因为我无法理解什么不起作用
  • 好吧,我已经删除了所有的单引号并将下划线替换为@,但我的数据库此时根本不会更新
  • 我自己从未使用过它,但您可以尝试使用SHOW PROFILE 启用分析器并查看实际执行的查询。查看原始查询可能会帮助您发现问题,无论是语法还是其他地方。这是解决 SQL Server 问题的一种行之有效的方法,因此它也可能对 MySQL 有所帮助

标签: c# mysql parameters


【解决方案1】:

尝试用 @ 符号替换您的参数并删除单引号,如下所示:

SQL = "UPDATE leerlingen SET Naam = @naam, Adres = @adres";

cmd.Parameters.AddWithValue("@naam", txt_naam.Text);
cmd.Parameters.AddWithValue("@adres", txt_adres.Text);

【讨论】:

  • 嗨,谢谢你的回答,我这样做了,但我不会用正确的信息更新我的数据库。
  • @JoeyDeLaat 奇怪,我不明白它为什么会失败,我以前做过。你有错误吗?
  • 不,这也是困扰我的问题,我可以尝试使用参数创建一个插入命令,看看是否可以这样,然后确定是代码问题。
  • 您是否尝试过更改执行命令的方式?我通常做MySQLCommand cmd = new MySQLCommand(); cmd.Connection = dbconnect.connection; cmd.CommandText = sqlString;@JoeyDeLaat
【解决方案2】:

我认为你做错的是你不能像那样初始化你的 MySqlCommand 。应该是这样的。。

MySqlCommand cmd;

cmd = dbconnect.createCommand();
cmd.CommandText = "UPDATE tableName SET firstname=@firstname, lastname=@lastname where id=@id";
cmd.Parameters.AddWithValue("@id", idTxt.Text);
cmd.Parameters.AddWithValue("@firstname", fName.Text);
cmd.Parameters.AddWithValue("@lastname", lName.Text);
cmd.ExecuteNonQuery();

【讨论】:

  • dbconnect 是一个不包含 createCommand 方法的类,因此我将无法调用该函数
  • 我以为dbconnect就是你的MySqlConnection。也许您可以将其更改为您的 MySqlConnection 。
  • 我认为你的意思正是我正在使用 MysqlCommand cmd = new MysqlCommand(sql,dbconnect.connection();
  • 啊。也许吧,但我认为这是初始化 MySqlCommand 的另一种方式。你已经试过了吗?我从我的 C# 教授那里得到了这种格式。
【解决方案3】:

当我在 c# 中创建一个新数据时,我会这样 ..

//值

String a = "COL1ROW1", b = "COL1ROW2";

//这是mysql的代码

String query = "Insert Into tableName(Column1, Column2)values('" + a + "','" + b + "')";

//conn是你的mysql连接

MySqlCommand cmd = new MySqlCommand(query, conn);

//然后执行它

cmd.ExecuteNonQuery();

【讨论】:

  • 在这种情况下停止以这种方式创建数据,因为这样的查询容易受到 SQL 注入攻击。以这种方式使用代码是灾难的直接途径
  • 没错,这就是我在代码中注释掉这个方法的原因。
  • 啊。会带来怎样的灾难?我总是使用这样的代码,但我没有得到任何错误或任何东西。
  • SQL注入是一种恶意用户可以通过网页输入将SQL命令注入SQL语句的技术。注入的 SQL 命令可以更改 SQL 语句并危及 Web 应用程序的安全性。来源:w3schools.com/sql/sql_injection.asp
  • 哦?我懂了。然后我想我会停止这样做。谢谢提供信息。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2014-04-17
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2013-05-29
相关资源
最近更新 更多