Lazarus使用Zeos连接Oracle出现SIGSEGV错误及DBGrid不显示问题
问题排查与解决方法
根因说明
你遇到的两个问题核心原因分别是:
- 初始的
External: SIGSEGV错误是因为数据模块TOracleMng没有被初始化创建,全局变量OracleMng为空指针,直接调用其下的控件就会触发段错误 - 加非空判断后不报错但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
相关产品推荐
相关产品推荐

