DELPHI异常调用EAccess Violation

时间:2018-02-23 13:04:02

标签: delphi ms-access exception

有一个类似于此的问题,但是用户使用更先进的方式,所以我很困惑。

这是异常爆发的程序。特别是在ADOCon.connected行上。我正在使用dbgo stuff和Microsoft访问我的数据库。

我得到的例外是:EAcessViolation。我想知道我做了什么错误以及如何解决它。我已使用预先存在的数据库和新数据库运行该过程。当存在预先存在的数据库时,例外是第19行,而没有它在第14行。正如用户提到的,我已经阅读了文档但是我仍然对如何解决错误感到困惑。错误肯定在这里,因为这是我调用的第一个访问权限。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,DB, ADODB,ComObj;

type
 TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
ADOCom:TADOcommand;
ADOCon:TADOConnection;
ADOQ:TADOQuery;
nameDB:string;
db:OLEVariant;

begin
namedb:='Brill.accdb';
if not fileexists(namedb) then
  begin
    db:=createOLEObject('ADOX.Catalog');
    db.create('Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+nameDB+';');
    db:=null;
  ADOCon.connectionstring:='Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+
    nameDB+';';
    ADOCon.connected:=True;
    ADOCon.loginprompt:=False;
  end
else
  ADOCon.connectionstring:='Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+
  nameDB+';';
end.

1 个答案:

答案 0 :(得分:1)

您的代码充满了错误。

当您在代码中声明特定类类型的变量时,您负责创建该类的实例并在使用它之前将其分配给变量,并在完成后清理它。

var
  ADOCon: TAdoConnection;
  ADOCom:TADOcommand;
  ADOQ:TADOQuery;

begin
  ADOCon := TADOConnection.Create(nil);
  try
    // Set up connection properties here 
    ADOQ := TADOQuery.Create(nil);
    try
      // Set up ADOQ properties and use query here
    finally
      ADOQ.Free;
    end;
  finally
    ADOCon.Free;
  end;
end;

此外,您对db: OleVariant(以及与之相关的所有代码)的使用绝对没有任何作用。您获得一个实例,为该实例分配属性,然后将其丢弃,这意味着您可以完全删除该变量和与之相关的三行代码;他们服务于零。

当然,比上述任何一个更好的解决方案是在表单中添加TDataModule,在其上放置TADOConnection和TADOQuery,在Object Inspector或数据模块的OnCreate中设置属性。然后,您可以将该数据模块移动到可用表单列表中,将其移动到主表单之前创建,并可以从应用程序中使用该数据模块的任何位置进行访问,并且数据模块将在您退出应用程序时正确释放所有内容。它还将所有数据库代码与用户界面分开,大大清理了代码。