Delphi在运行时设置AdoConnection会导致访问冲突

时间:2020-08-04 10:38:35

标签: database delphi

我正在尝试编写一个动态创建TADOQuery的函数。使用此函数,我可以在函数的参数中更改其SQL.Text属性。我的函数调用应如何工作:

procedure TDlgMain.FormCreate(Sender: TObject);
var
  Q: TADOQuery;
begin
  Q := NewQuery('select * from Utenti');
  Q.Open;
end;

该函数的代码和访问冲突错误的屏幕快照,有没有办法解决?

function NewQuery(Conn: TADOConnection; SQL: String): TADOQuery; overload;
function NewQuery(SQL: String): TADOQuery; overload;


function TDMDB.NewQuery(Conn: TADOConnection; SQL: String): TADOQuery;
begin
  Result := TADOQuery.Create(nil);
  Result.Connection := Conn;
  Result.SQL.Text := SQL;
end;

function TDMDB.NewQuery(SQL: String): TADOQuery;
begin
  Result := NewQuery(DBConn, SQL);
end;

image

1 个答案:

答案 0 :(得分:1)

该错误表明您尝试通过TDataModule使用它创建查询时尚未创建DMDB.NewQuery()

错误的原因有两个。

首先,使用IDE首先创建表单(在您的情况下为DlgMain: TDlgMain),然后再创建数据模块(TDMDB: TDataModule)。这会将模块创建之后的模块创建放置在项目文件(.dpr)中,如下所示:(要查看.dpr文件,请选择菜单Project - View source

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDlgMain, DlgMain);
  Application.CreateForm(TDMDB, DMDB);
  Application.Run;
end.

第二,当您尝试在主表单OnCreate()事件中创建连接时,当尚未创建数据模块时,结果就是您看到的AV。

您可以通过在创建主表单之前移动数据模块的创建来纠正错误:

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDMDB, DMDB);    // Create this before the form
  Application.CreateForm(TDlgMain, DlgMain);
  Application.Run;
end.

旁注,以防万一:

您可能已经知道,通过Application.CreateForm()创建的第一个表单将成为主要表单,并且仍然有效。数据模块不是表单,因此您的DlgMain仍然是第一个创建的表单,并成为主表单。