You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lazarus使用Zeos连接Oracle出现SIGSEGV错误及DBGrid不显示问题

问题排查与解决方法

根因说明

你遇到的两个问题核心原因分别是:

  1. 初始的External: SIGSEGV错误是因为数据模块TOracleMng没有被初始化创建,全局变量OracleMng为空指针,直接调用其下的控件就会触发段错误
  2. 加非空判断后不报错但DBGrid无数据,一方面是非空判断不成立时代码不执行,另一方面是查询语句调用方法错误、控件绑定关系缺失

修复步骤

1. 修复数据模块初始化问题

你的项目入口lpr文件中只创建了主窗体TLogin,没有创建数据模块,修改lpr代码,在创建主窗体前添加数据模块的创建逻辑:

begin
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  // 先创建数据模块
  Application.CreateForm(TOracleMng, OracleMng);
  Application.CreateForm(TLogin, Login);
  Application.Run;
end.  

你也可以在Lazarus的项目选项-窗体页面,把TOracleMng添加到自动创建窗体列表中,效果一致。

2. 修复查询逻辑与控件绑定

错误点修正:

  • SELECT查询语句不能调用ExecSQL,该方法仅用于无返回结果集的增删改操作,查询需要调用Open方法激活数据集
  • 确认控件绑定关系:设计期将DataSource1的DataSet属性设为ZQuery1,将DBGrid1的DataSource属性设为DataSource1,如果设计期没有绑定可以在代码中手动赋值
  • 执行查询前先关闭已有查询,避免报错

修正后的按钮点击事件代码如下:

procedure TLogin.Button1Click(Sender: TObject);
begin
  // 提前拦截空对象情况
  if not (Assigned(OracleMng) and Assigned(OracleMng.ZQuery1) and Assigned(OracleMng.DataSource1)) then
    Exit;

  // 重置查询
  OracleMng.ZQuery1.Close;
  OracleMng.ZQuery1.SQL.Clear;
  OracleMng.ZQuery1.SQL.Add('select * from help');

  // 打开查询获取结果集
  OracleMng.ZQuery1.Open;

  // 未在设计期绑定时可取消下面两行注释
  // OracleMng.DataSource1.DataSet := OracleMng.ZQuery1;
  // DBGrid1.DataSource := OracleMng.DataSource1;

  DBGrid1.Refresh;
end;

3. 额外检查项

  • 确认ZConnection1的连接参数配置正确:用户名、密码、Oracle服务名、端口、Protocol属性选择对应Oracle驱动,执行查询前确保连接已打开(可以设置Connected属性为True或者调用Open方法)
  • 确认本地Oracle客户端位数和程序编译位数一致(32位程序对应32位Oracle客户端,64位同理),避免Zeos无法加载驱动
  • 直接在Oracle客户端执行SQL语句select * from help,确认语句本身可以返回数据

内容的提问来源于stack exchange,提问作者Wario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:54:03