尝试在c#windows应用程序中捕获问题

时间:2013-04-04 12:00:56

标签: c# sql sql-server database ado.net

当我执行我的程序时,执行必须在存在现有项目时进入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();
}

2 个答案:

答案 0 :(得分:2)

catch部分仅在try块内存在错误时才会被评估。因此,如果调用导致异常,那么它将落入该块,或者如果你引发异常,它也将会出现。

ExecuteNonQuery会返回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();
}

而且,您确定要使用异常来处理执行流程吗?这通常是不受欢迎的,因为在特殊情况下,根据其名称的例外情况。你知道可能发生什么的实例并不是特例。

答案 1 :(得分: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();
}