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

如何在Yii2中通过ODBC连接正确的Pervasive数据库?

如何定位并连接正确的Pervasive主数据库(Yii2 + ODBC场景)

现状说明

已在Yii2中通过32位ODBC驱动成功连接Pervasive数据库的DEMODATA库,对应控制器代码如下:

public function actionIndex() {
    try {
        $odbc = odbc_connect("Driver={Pervasive ODBC Interface};ServerName=localhost;ServerDSN=DEMODATA;", "", "");
        $result = odbc_tables($odbc);
        var_dump(odbc_fetch_array($result));
    } catch (\Exception $e) {
        echo "Connection failed: " . $e->getMessage();
    }
}

执行后仅返回DEMODATA库中的Billing表。尝试连接ODBC中列出的DEFAULTDB时,测试连接成功但代码报错:

Connection failed: odbc_connect(): SQL error: [Zen][ODBC Client Interface][LNA][Zen][SQL Engine][Data Record Manager]Non-db file or corrupted db., SQL state S1000 in SQLConnect

改用32位ODBC工具创建DEFAULTDB连接后,执行代码仅返回系统表X$Attrib,无法确认是否为目标主库。

排查与解决步骤

1. 定位真实业务数据库

打开Pervasive Control Center(PCC),查看服务器上已注册的数据库列表:

  • DEFAULTDB是Pervasive默认空库,仅含系统表,非业务库;TEMPDB为临时数据库,不存储持久业务数据。
  • 在PCC中找到包含多业务表的目标数据库,记录其名称。

2. 创建匹配的32位ODBC DSN

打开32位ODBC数据源管理器(路径:C:\Windows\SysWOW64\odbcad32.exe):

  • 新建系统DSN,选择Pervasive ODBC Interface驱动;
  • 配置时指定步骤1中找到的目标数据库名称,完成后测试连接确保成功。

3. 修正Yii2连接代码

更新连接字符串为目标数据库的DSN名称,同时调整表查询逻辑以返回所有用户表:

public function actionIndex() {
    try {
        // 替换为实际目标数据库的ServerDSN名称
        $odbc = odbc_connect("Driver={Pervasive ODBC Interface};ServerName=localhost;ServerDSN=YourTargetDB;", "", "");
        // 过滤仅返回用户业务表,排除系统表
        $result = odbc_tables($odbc, "", "", "", "'TABLE'");
        // 循环输出所有表信息
        while ($row = odbc_fetch_array($result)) {
            var_dump($row);
        }
    } catch (\Exception $e) {
        echo "Connection failed: " . $e->getMessage();
    }
}

4. 环境兼容性验证

确保运行Yii2的PHP环境为32位,与已确认可用的32位Pervasive ODBC驱动位数一致,避免因位数不匹配导致连接异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:00:17