-5

当我执行我的程序时,当有一个现有项目时,执行必须进入 catch

con2=new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0DataSource=e:\\convert.accdb" + "; Persist Security Info=False");
OleDbCommand cmd = new OleDbCommand(sql, con2);           
con2.Open();           
try {
  cmd.ExecuteNonQuery();
  con2.Close();
  MessageBox.Show("Thanks");
}
catch (Exception ex) {
  MessageBox.Show(ex.Message);
  con.Close();
}
4

2 回答 2

2

catch只有在块中存在错误时才会评估该部分try。因此,如果调用导致异常,那么它将落入该块,或者如果您引发异常,它也会。

ExecuteNonQuery返回 an int,因此,如果您想在返回大于 0 时抛出异常,请执行以下操作:

con2.Open();

try {
  if (cmd.ExecuteNonQuery() > 0) {
    throw new Exception("More than zero rows affected");
  }
  con2.Close();
  MessageBox.Show("Thnaks");
}
catch (Exception ex) {
 MessageBox.Show(ex.Message);
 con.Close();
}

但即使这样也有很多不足之处。例如,您可以finally用于管理连接(以及您的命令,因为它们也是一次性的):

try {
  if (cmd.ExecuteNonQuery() > 0) {
    throw new Exception("More than zero rows affected");
  }
  MessageBox.Show("Thanks");
}
catch (Exception ex) {
 MessageBox.Show(ex.Message);
}
finally {
  con.Close();
  con2.Close();
  cmd.Close();
}

更进一步,您确定要使用异常来处理执行流程吗?这通常是不受欢迎的,因为根据他们的名字,在特殊情况下会考虑例外情况。您知道会发生什么的情况几乎没有例外。

于 2013-04-04T12:04:55.587 回答
0

听起来你正在寻找这样的东西。您需要捕获 SqlException 然后遍历其 Errors 集合以查找与您期望的错误匹配的消息。

try
{
  cmd.ExecuteNonQuery();
  con2.Close();
  MessageBox.Show("Thanks");
}
catch (SqlException ex)
{
   for (int i = 0; i < ex.Errors.Count; i++)
   {
        if (ex.Errors[i].Message.Contains("There is already an object named"))
        {
             /* Handle duplicate situation here */
             break;
        }
   }
}
catch (Exception ex)
{
  MessageBox.Show(ex.Message);
  con.Close();
}
于 2013-04-05T13:29:49.317 回答