【问题标题】:Displaying an error message during insert execution在插入执行期间显示错误消息
【发布时间】:2014-10-06 18:19:09
【问题描述】:

如果学生已经分配了当前插入到mysql数据库中的位置,我如何显示错误消息,然后回滚事务?

如果分配了不同的位置,它应该继续检查下一行。

这是我的插入代码:

conn.Open();

MySqlTransaction mt = conn.BeginTransaction();

try {
    for (int cnt = 0; cnt <= lv1.Items.Count - 1; cnt++) {
        if (lv1.Items[cnt].SubItems[3].Text == " ")
            continue;

        string query = "insert into candidate(pid,s_id)values(@pid,@sid)";

        MySqlCommand cmd = new MySqlCommand(query, conn);

        cmd.Parameters.Add(new MySqlParameter("@pid", lv1.Items[cnt].SubItems[0].Text ));
        cmd.Parameters.Add(new MySqlParameter("@sid", lv1.Items[cnt].SubItems[2].Text));

        cmd.Transaction = mt;
        cmd.ExecuteNonQuery();
    }
    mt.Commit();
} catch (Exception error) {
    MessageBox.Show(error.Message);
    mt.Rollback();
}
conn.Close();

这是我的虚拟学生表:

这是我的虚拟位置表:

这是我的虚拟候选表:

这是我的列表视图控件示例:

【问题讨论】:

  • MessageBox.Show(error.Message); 不适合你吗?
  • 这个问题的问题是至少有3个。关于如何显示错误消息的一个问题。另一个问题是关于如何回滚数据库事务。第三个问题是关于如何编写算法来完成这一切。
  • @Sam 我是,我的主要问题是如果学生已经被分配了“那个”位置,我将如何显示错误消息或仅显示消息。你提到的最后两个问题。 . .与第一个相比只是一个小问题... xD

标签: c# mysql user-interaction


【解决方案1】:

不要依赖插入语句中的异常:如果不插入任何内容,则无需执行回滚。

相反,检查项目是否已经存在,如果不存在则仅插入。如果需要告诉用户它已经存在,可以显示消息框。

例如:

// This is just an example; not sure what exact conditions you need
var cmdExists = new MySqlCommand("SELECT 1 FROM candidate WHERE pid = @pid");
cmdExists.Parameters.Add(new SqlParameter("@pid", lv1.Items[cnt].SubItems[0].Text));
if (cmdExists.ExecuteScalar() == DBNull.Value)
{
     string query = "insert into candidate(pid,s_id)values(@pid,@sid)";
     ...
 } else {
     MessageBox.Show("some error message that makes sense to your user");
 }

【讨论】:

  • 我真的非常讨厌人们在不提供解释的情况下投反对票。这带有怯懦、懒惰、无知或以上所有特征的味道。这是一个旨在帮助人们解决编程问题的网站,如果您不解释原因,人们将永远学不会。
  • 谢谢。 . .我会分析你提供的这个样本 xD
  • 我不是大师,所以也许你的方法很好......但我通常会尝试使用SELECT COUNT(*)...,以避免出现任何类型的null。我的方式,我总是得到一个有效的整数值。
  • @DonBoitnott:这是一个正确的观点,但我倾向于使用 SELECT 1,因为我几乎总是在 SQL Server 中将它与 EXISTS 语句一起使用(IF EXISTS(SELECT 1 FROM ...)这将缩短它找到的第一条记录的执行,而不必遍历所有匹配项来查找计数。MySql 的行为可能不同,但我发现这种方法确实提高了 SQL Server 的性能。
猜你喜欢
  • 1970-01-01
  • 2016-08-08
  • 2015-02-02
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多