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

Database Delphi在运行时设置AdoConnection会导致访问冲突,database,delphi,Database,Delphi,我试图编写一个函数,动态创建一个TADOQuery。通过这个函数,我可以在函数的参数中更改它的SQL.Text属性。我的函数调用应该如何工作: procedure TDlgMain.FormCreate(Sender: TObject); var Q: TADOQuery; begin Q := NewQuery('select * from Utenti'); Q.Open; end; 这里是函数的代码和访问冲突错误的屏幕截图,有没有办法解决这个问题 function NewQu

我试图编写一个函数,动态创建一个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;

该错误表示在您尝试使用TDataModule通过DMDB.NewQuery创建查询时,尚未创建TDataModule

错误的原因是双重的

首先,在您的案例中,使用IDE首先创建一个表单DlgMain:TDlgMain,然后创建一个数据模块TDMDB:TDataModule。这会将模块创建放在项目文件.dpr中表单创建之后,如下所示:要查看.dpr文件,请选择菜单“项目-查看源”

其次,当您试图在主窗体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仍然是第一个创建的表单,并成为主表单。

地址中的数字较低,使其看起来像是在调用一个对象引用为零的方法。那么什么是DBConn?它从哪里来,又从哪里回来?你在哪一行得到这个例外?旁注:TAdoQuery不会自动释放。你需要在完成后释放它,否则你会有很大的内存泄漏,甚至可能让游标打开到你的数据库。DBConn是我的ADOConnection对象,配置如下:connected=True,connectionstring不为空,loginprompt=false我在这一行中得到异常:Result:=NewQueryDBConn,SQL@马特塞梅斯特罗:是的,但是你从哪里获得连接?您自己创建吗DBConn:=TADOConnection.create。。。或者它是您在表单上丢弃的组件?此外,您应该能够更精确地定位代码行。在Result:=NewQueryDBConn、SQL上放置断点F5,然后运行应用程序。将光标悬停在DBConn上方,查看它是已分配还是为零。然后按F7进入新查询。继续按F7以精确定位线。您尚未显示所有代码。您的newquery实现似乎是datamodule的一部分。我们无法看到它是否是在tdlgmain调用之前创建的,而tdlgmain调用似乎是另一个调用。因此,可能是您尚未实例化该模型,或者该模型未完全初始化(例如,连接为零)。因此,最好使用调试器跟踪执行。@matithemaestro您显示的代码表明DBConn来自TDataModule,而不是TForm。TDataModule是否可能有自己的未分配DBConn成员?
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDMDB, DMDB);    // Create this before the form
  Application.CreateForm(TDlgMain, DlgMain);
  Application.Run;
end.