c#.NET中的唯一约束异常处理

时间:2017-01-02 13:38:28

标签: c# oracle winforms exception-handling unique-constraint

我是c#.NET的初学者,我很难找到一种有效的方法来捕获c#(windows窗体)中的唯一约束异常。

我正在处理三个数据库表列的组合,这些列应该是唯一的,但我无法处理表单上出现的异常。

我在我的数据库管理器的 if(list.size()>=10) { loadButton.setVisibility(VISIBLE); } else { loadButton.setVisibility(GONE); } 事件上尝试的代码附在下面。在此先感谢您的帮助。我正在寻找一种有效的方法来捕获异常(Oracle)。

OnBeforeSaving

更新的代码块是

private void dbInstCharges_OnBeforeSaving(object sender, DataManagerSaveArgs e)
{
    try
    {
        this.dbInstCharges.Table.PrimaryKey = new DataColumn[] { dbInstCharges.Table.Columns["EQ17_GC09_ID"], dbInstCharges.Table.Columns["EQ17_CH01_ID"], dbInstCharges.Table.Columns["EQ17_GC05_ID"] };
    }
    catch (ConstraintException ex)
    {
        MessageBox.Show(ex.Message);
    }

处理ArgumentException后的代码。

        private void dbInstCharges_OnBeforeSaving(object sender, DataManagerBeforeSavingArgs e)
       {
        //e.Record["EQ17_SS01_ID"] = Config.MemberID;
        //e.Record["EQ17_EQ16_ID"] = dbManager.CurrentDataRecord["EQ16_ID"];
        try
        {
            UniqueConstraint TableUnique = new UniqueConstraint (new DataColumn[] { dbInstCharges.Table.Columns["EQ17_GC09_ID"], dbInstCharges.Table.Columns["EQ17_CH01_ID"], dbInstCharges.Table.Columns["EQ17_GC05_ID"] });
            dbInstCharges.Table.Constraints.Add(TableUnique);
            //this.dbInstCharges.Table.PrimaryKey = new DataColumn[] { dbInstCharges.Table.Columns["EQ17_GC09_ID"], dbInstCharges.Table.Columns["EQ17_CH01_ID"], dbInstCharges.Table.Columns["EQ17_GC05_ID"] };
        }
        catch (Exception ex)
        {
            MessageBox.Show("Please enter a unique record");

        }
      }

1 个答案:

答案 0 :(得分:1)

我认为你并不真正了解异常处理。我将尝试解释你的错误/误解作为答案。如果执行代码块,则此代码将运行到发生异常或完成的位置。如果发生异常,则代码会中断并抛出异常或执行catch-block(如果存在)。如果您使用try{} catch{}结构并发生异常,则代码将在catch{}中跟随。但是你的try-block中没有goto或跳回你的代码。这对您的代码块意味着什么:

try
{
  UniqueConstraint TableUnique = new UniqueConstraint(new DataColumn[{//Your data});
  dbInstCharges.Table.Constraints.Add(TableUnique);
  //this.dbInstCharges.Table.PrimaryKey = new DataColumn[] {//Your data};
}
catch (ArgumentException ex)
{
  MessageBox.Show("Please enter a unique record");
}

执行try-block直到发生Argument-Exception。因为你捕获ArgumentException(这是正确的方法),代码跳转到catch块并执行它。将显示消息,您的代码已完成。确保在处理异常后代码不会跳回并执行try-block的更多行。这不会也不会起作用,因为有一个错误的参数可以破坏你的代码。 因此,修复您的Argument-Exception绝对是绝对的。修复此问题后,您可以按如下方式处理Unique-Constraint Exception:

try
{
    UniqueConstraint TableUnique = new UniqueConstraint(new DataColumn[{//Your data});
  dbInstCharges.Table.Constraints.Add(TableUnique);
  //this.dbInstCharges.Table.PrimaryKey = new DataColumn[] {//Your data};
}
catch (OracleException ex)
{
  MessageBox.Show("Please enter a unique record.");
}
  

ArgumentException总是在你的代码之前破坏你的代码   执行Unique-Constrain异常。这就是为什么这个例外   从来没有抓过。