我是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");
}
}
答案 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异常。这就是为什么这个例外 从来没有抓过。