【问题标题】:CheckedListBoxControl Devexpress C# ---- Saving all items in MysQL DatabaseCheckedListBoxControl Devexpress C# ---- 将所有项目保存在 MySQL 数据库中
【发布时间】:2018-07-04 18:02:08
【问题描述】:

好的,这是对这个问题的新编辑,正如您将在下面的代码中看到的那样,我制作它以便我遍历每个项目,然后它应该获取每个项目的已检查和未检查值,然后保存它们在我的 MySql 数据库中,但是,我保存它的那一刻确实保存了,但所有项目都保存在 boolean true 中,而不是我分配的布尔值,它应该是 布尔值强>。 这意味着如果检查了一个项目,则布尔值应该为真,而未检查一个项目,布尔值应该为假,并且应该被保存,但是......好吧,它将 一切 保存为真. 我该如何解决我遇到的这个问题?

private void SbtnGuarda_Click(object sender, EventArgs e)
    {
        try
        {
            String id = txtId.Text.Trim();               
            for (int i = 0; i < CLBCpermits.ItemCount; i++)
            {
                object Row = CLBCpermits.GetItem(i);
                DataRowView rew = Row as DataRowView;
                Boolean value = Convert.ToBoolean(CLBCpermits.GetItemCheckState((int)rew["SecOptionId"] - 1));
                int opti = (int)rew["SecOptionId"];                   
                string qry = string.Format("INSERT INTO TblSecProfile (Id, OptActive, SecOptionId) VALUES ('{0}', '{1}', '{2}');", id, value, opti);
                using (MySqlConnection conn = new MySqlConnection(Global.ConnectionStringMySql))
                {
                    conn.Open();

                    using (MySqlCommand comm = new MySqlCommand(qry, conn))
                    {
                        comm.ExecuteNonQuery();
                    }

                    conn.Close();
                }      
            }

            XtraMessageBox.Show("Permits assigned to profile", "Process Finished", MessageBoxButtons.OK, MessageBoxIcon.Information);
            SbtnGuarda.Enabled = false;
            SbtnActualiza.Enabled = true;

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error while giving permits", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }

非常感谢任何帮助,并感谢您第四次编辑这篇文章。

【问题讨论】:

  • 这一定意味着value 总是正确的。 OptActive 是数据库中的BIT 吗?
  • 是的,它是数据库中的BIT,但是值怎么可能总是正确的呢?如果我说它必须获取项目的值是否被选中,感谢GetItemCheckState

标签: c# mysql devexpress checkedlistbox


【解决方案1】:

首先,使用查询参数。您当前的代码很危险。如果您不确定我为什么这么说,请查看“SQL 注入”。

现在,使用参数,您将拥有:

var query = "INSERT INTO TblSecProfile (Id, OptActive, SecOptionId) VALUES (@id, @optActive, @secOptionId)";

后来……

comm.Parameters.Add("@id", MySqlDbType.Int32).Value = id;
comm.Parameters.Add("@optActive", MySqlDbType.Bit).Value = value;
comm.Parameters.Add("@secOptionId", MySqlDbType.Int32).Value = opti;
comm.ExecuteNonQuery();

我的猜测是,因为您在查询中为 BIT 类型的列提供了 String 值,所以转换正在接管并将所有内容转换为 TRUE

【讨论】:

  • 我认为注入不会有问题,因为我在使用checkedlistboxcontrol和预设id时这样做,尽管如果需要我会更改格式,去立即试用您的解决方案。
  • 好吧,只是 triend,是的,因为我向 Bit 类型列发送了一个 String 值,所以我将所有内容都保存为 true,非常感谢。
  • 另外,使用参数会让你养成编写更好代码的习惯,并迫使你正确尊重数据类型。只是一个很好的全方位练习。
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多