php - 插入或删除时,与 PDO 的 DB2 连接抛出一般错误 -7008

标签 php pdo odbc ibm-midrange db2-400

我们正在开发一个 PHP 应用程序,它连接到 PostgreSQL 服务器和 IBM i使用 DB2 的服务器。虽然与 PGSQL 的 PDO 连接工作得很好,但与 DB2 的连接只能从表中获取;尝试插入或删除会导致以下错误:

SQLSTATE[HY000]: General error: -7008 (SQLExecute[4294960288] at /build/php7.0-ltLrbJ/php7.0-7.0.33/ext/pdo_odbc/odbc_stmt.c:260)

此错误在我们的开发和生产环境中都会发生。两台服务器都是 Ubuntu(版本不​​同,但相差不大);我正在使用 PDO 的 ODBC 驱动程序。

我们尝试使用不同的用户连接到其他 IBM i 服务器,但仍然出现完全相同的问题。可以选择,但不能插入。谷歌搜索错误代码不会产生任何有用的结果,并且正如您所看到的错误消息本身一样,它毫无帮助。 SQLExecute 中的代码尤其不会出现在任何地方,甚至没有出现一个结果(IBM 页面有一个结果,但它实际上是一个不同的错误代码)。

代码非常简单,但可能存在一些明显且明显的错误。

测试脚本:

include("DB2.php");
$oDAO = new DAO();
$res = $oDAO->ejecuta("INSERT INTO <Library>.<File> VALUES (1,0,1)");

DAO:

class DAO{
    var $link;

    public function __construct(){
        // función constructora, inicia la conexión

        $this->link = new PDO("odbc:DRIVER={IBM i Access ODBC Driver};SYSTEM=<System>;PROTOCOL=TCPIP",
                            '<user>', '<pass>');
        $this->link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->link->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }

    private function begin()    { $this->link->beginTransaction(); }
    private function rollback() { $this->link->rollBack(); }
    private function commit()   { $this->link->commit(); }

    public function ejecuta($query){
        try{
            $this->begin();
            $oResult = $this->link->query($query);
            if($oResult){
                $bResult = true;
                $this->commit();
            }else{
                $bResult = false;
                $this->rollback();
            }
        }
        catch (Exception $e){
            echo $e->getMessage();
            $bResult = false;
            $this->rollback();
        }
        return $bResult;
    }
}

坦白说,我们别无选择,我已经为此浪费了两周时间。我们只需要插入和删除记录。因此欢迎任何帮助。

最佳答案

您描述的症状与尝试在 promise 控制下修改数据库但未启用日志功能一致。

解决这个问题有三种常见的方法:

  1. 打开日记功能。这是非常极端的,因为管理数据库的人必须这样做,并且如果他们关闭了日记功能,那么他们可能并不真正知道如何处理日记,或者不想这样做。但这是对 Db2 for i 进行完全 promise 控制的唯一实用方法。

  2. 打开自动提交进行连接。这将为使用此连接执行的任何数据库修改 SQL 语句添加隐式提交。根据我的经验,这是处理这种情况最常见、最方便的方法。

  3. WITH NC 添加到每个相关的 SQL 语句中。原则上,这使您能够逐条语句地控制是否暂停 promise 控制。实际上,如果您首先考虑这样做,您可能没有启用日志功能,因此您必须对每个数据库修改 SQL 语句执行此操作。这就是为什么大多数人倾向于选择 2。

关于php - 插入或删除时,与 PDO 的 DB2 连接抛出一般错误 -7008,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56770398/

相关文章:

php - 如何从 mysql 数据库检索数据并填充到 jquery mobile 的 ListView 中

php - SQL从表中选择不同的最后一个值

php 的字符加倍(这破坏了 mysql_real_escape_string、PDO->quote 等)

php - 优化包含 PDO 查询的 while 循环

c# - 错误 : "No data exists for the row/column" using OdbcDataReader

php - 使用ajax从php发送和返回值时,为什么我会收到javascript和html代码?

javascript - WordPress admin-ajax.php 总是返回 0

php - 将包含数组的表单数据安全插入 mysql 数据库

php - 在 Mac OSX 上启用 PHP pdo_odbc 扩展

c# - 如何使用 ODBC 连接 .NET Core 中的 Sybase 17 ASA?