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



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

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

下面是我在数据库管理器的OnBeforeSaving事件上尝试的代码。提前感谢您的帮助。我正在寻找一种有效的方法来捕获异常(Oracle)。

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

更新的代码块是

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

处理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.Columns["EQ17_SS01_ID"], dbInstCharges.Table.Columns["EQ17_EQ16_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"], dbInstCharges.Table.Columns["EQ17_SS01_ID"], dbInstCharges.Table.Columns["EQ17_EQ16_ID"] };
}
catch (ArgumentException ex)
{
MessageBox.Show("Please enter a unique record");
}
}

我想您并没有真正理解异常处理。我会尽力解释你的错误/理解错误作为回答。如果您执行一个代码块,则该代码将一直运行到异常发生或完成的点。如果发生异常,则代码中断并抛出异常,或者执行catch块(如果存在)。如果使用try{} catch{}结构并且发生异常,则代码将出现在catch{}中。但是在try块中没有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块一直执行到出现Argument Exception的点。因为您捕获了ArgumentException(这是正确的方法),所以代码会跳到catch块并执行它。显示Message,代码就完成了。确保在处理异常后,代码不会跳回并执行try块的更多行。这不会也不能工作,因为有一个错误的参数破坏了你的代码因此,修复Argument 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总是在使用执行唯一约束异常。这就是为什么这个例外从未被抓到。

最新更新