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