3

有人可以启发我使用 try finally 处理数据库连接(和错误)吗?最佳做法是什么?见过各种风格,但我想知道最好的方法是什么。应该将表的打开放在 TRY 块中还是仅放在主连接字符串中?因为我通常把我的数据库(绝对数据库,访问..)放在我的 exe 文件夹中,所以我想知道最好的方法......或者首先检查文件......

if (FileExists(sDatabasePath)) then begin
    ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+sDatabasePath+';Persist Security Info=False';
    try
        ADOConnection1.Connected:=True;
        ADOTable1.Open;
    except
        ShowMessage ('cant access the database !');
    end;
end;

???

4

2 回答 2

2

评论:

  • 永远不要吞下异常,就像你在你的ShowMessage情况下所做的那样。调用您的过程的代码无法知道出了什么问题。仅当您可以修复错误时才处理错误,或者让它们冒泡应用程序错误处理程序,在那里它们将显示给用户。
  • 根据您的代码的工作方式,您可能希望使用 a 保护与数据库的连接,try-finally以便在工作完成后断开连接。我不这样做,我通常在应用程序的生命周期内保持连接打开。
  • 根据您ADOTable1对它所做的事情,您可能希望确保在完成与其他try-finally块一起使用后将其关闭。我通常这样做是因为我不使用 Db 感知 GUI 控件,而且我是一个控制狂。我也手动处理事务(启动事务/提交/回滚)
  • 不要忽略错误。如果您的数据库不存在(即:FileExists()返回 false),则调用您的过程的代码一无所知,用户也不知道。

这是我重新编写代码的方式:

if (FileExists(sDatabasePath)) then 
  begin
      ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+sDatabasePath+';Persist Security Info=False';
      ADOConnection1.Connected:=True;
      try
        ADOTable1.Open;
        try
          // Do non-GUI database stuff here.
        finally ADOTabel1.Close;
        end;
      finally ADOConnection1.Connected := False;
      end;
  end
else
  raise Exception.Create('Database file not found');
于 2011-07-07T11:30:51.487 回答
1

如果我无法打开数据库,我会终止应用程序 - 除非您专门构建处理此问题的架构,否则如果没有数据库访问权限,您将无能为力。

除此之外,只需让默认的应用程序错误处理程序处理错误,因为无论如何它都会非常意外。

于 2011-07-07T11:34:34.467 回答