0

我正在使用 ADODB 从 PHP 连接到 SQL Server 数据库。我有几个存储过程,我一直在执行得很好。由于某种原因,我创建的最后一个调用一直失败。我将调试设置为 true,它工作得很好。我不知道为什么会这样。

这是我得到的错误

Error: mssql_execute() [<a href='function.mssql-execute'>function.mssql-execute</a>]:      stored procedure execution failed  in /path/to/adodb/lib/adodb5/drivers/adodb-mssql.inc.php on line 768

这是我创建的将所有存储过程传递给的方法,就像我说它与其他存储过程一样,但是这个方法和我已经仔细检查了参数和存储过程的所有拼写是否正确。

protected function _getSpArray($db, $sp, array $spParams) {
    try {
        $stmt = $db->PrepareSP($sp);
        foreach ($spParams as $param) {
            $db->InParameter($stmt, $param[0], $param[1]);
        }
        $db->SetFetchMode(ADODB_FETCH_ASSOC);
        $rs = $db->Execute($stmt);
        $rsArray = array();
        if (!$rs) {
            echo 'No records found \n';
            return;
        }
        else {
            foreach ($rs as $k => $row) {
                $rsArray[$k] = $row;
            }
        }
        return $rsArray;
    } catch (ErrorException $e) {
        echo $e->getMessage();
    }
}

它在 adodb5/drivers/adodb-mssql.inc.php 的 #768 行失败

$rez = mssql_execute($sql[1]);

并且 sql 数组具有这些值

[0] stored_procedure_name
[1] resource id='657' type='mssql statement'

我在 PHP.net 上看到了以下评论,我将 freetds 主机名更改为与 IP 地址不同的名称,但仍然没有。由于我使用的是 adodb,因此我不确定免费结果。

http://www.php.net/manual/en/function.mssql-execute.php#93938

我正在使用 adodb 5.11

4

2 回答 2

2

当您将 debug 设置为 true 时,ADODB 使用其他函数来执行该语句。在这种情况下function _adodb_debug_execute(&$zthis, $sql, $inputarr)

如果 debug 设置为 false ADODB 使用function &_Execute($sql,$inputarr=false). 当您检查这两种方法的来源时,您可以清楚地看到差异。

<?php
function _adodb_debug_execute(&$zthis, $sql, $inputarr)
{
    //ADODB prepares debug information dump...

    $qID = $zthis->_query($sql,$inputarr);

    //Here ADODB makes the difference

    if ($zthis->databaseType == 'mssql') { 
    // ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6
        if($emsg = $zthis->ErrorMsg()) {
            if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg);
        }
    } else if (!$qID) {
        ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg());
    }

    if ($zthis->debug === 99) _adodb_backtrace(true,9999,2);
    return $qID;
}
?>

这是_Execute函数

<?php
function &_Execute($sql,$inputarr=false){
        //Here ADODB chooses which fn to use
        if ($this->debug) {
            global $ADODB_INCLUDED_LIB;
            if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
            $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr);
        } else {
            $this->_queryID = @$this->_query($sql,$inputarr);
        }
        //...

        if ($this->_queryID === false) { // error handling if query fails
            //If debug ADODB prints backtrace regardless the result
            if ($this->debug == 99) adodb_backtrace(true,5);    
            $fn = $this->raiseErrorFn;
            if ($fn) {
                $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);
            } 
            $false = false;
            //Returns false no matter what...
            return $false;
        } 
        //...
    }
?>

尝试将其添加到您的脚本中以测试脚本的行为,并记住,如果执行失败,它将返回一个false值。因此,请注意返回值。

protected function _getSpArray($db, $sp, array $spParams) {
    try {
        $stmt = $db->PrepareSP($sp);
        foreach ($spParams as $param) {
            $db->InParameter($stmt, $param[0], $param[1]);
        }
        $db->SetFetchMode(ADODB_FETCH_ASSOC);
        $rs = $db->Execute($stmt);
        $rsArray = array();
        if (!$rs) {
            echo 'No records found \n';
            return;
        }
        else {
            foreach ($rs as $k => $row) {
                $rsArray[$k] = $row;
            }
        }
        //add this line to free the resources after use. 
        mssql_free_result($rs);
        return $rsArray;
    } catch (ErrorException $e) {
        echo $e->getMessage();
    }
}

希望能帮助到你!!

于 2011-01-16T18:23:54.100 回答
0

好的,在找到 php.net 评论后,即使我的 freetds 没有使用正确的名称设置,我使用的是 ip 地址。我也没有使用 V 8.0 我使用的是 7.0 并且在存储过程之前一切正常。我尝试了评论和 DarkThrones 答案中提供的 mssql_free_result 解决方案,但没有奏效,但是当我使用 adodb 的 close() 方法时,它正在工作。它使用免费结果并传递查询 id。

如果有人可以评论为什么这是必要的,那就太好了。是因为我使用了太多内存还是什么?

于 2011-01-17T14:03:11.190 回答