当查询中的Select之前有Insert时,Adodb.GetRow()不返回数据

时间:2014-01-23 18:48:39

标签: php sql-server select procedure adodb

我是新人。大多数时候我只是通过阅读找到解决方案,但现在我必须直接问你,因为我的主题很奇怪。

我在php中有一个应用程序,我曾经使用mssql库连接到MS Server 2008但现在我迁移了部分代码以通过ADODB进行连接http://adodb.sourceforge.net/

我有一个存储过程,我根据我发送的参数来验证/插入/更新/删除行,所以在最底部我有一行代码

 Select @Result Result

这个变量只是告诉我每次进程是否正确或者我是否遗漏了某些内容因此没有插入/删除/更新行。

这是我的商店程序的代码

        create procedure sp_MyTable @id int, @name varchar(100), @type varchar(10)
        as

        declare @Results varchar(100)
         set @Result=@type
         --validations!
        if exists(select * from MyTable where name=@name)begin

        set @Result='No insert:('
        end

         if @Result='insert'           
          insert into MyTable (name)values(@name)


           select @Result Result

这里和在php中创建我的连接的代码示例

        $pQry='exec sp_MyTable @id="0",@name="Hello",@type="insert"';


            require ("php/ExtClases/adodb5/adodb.inc.php");

             $db = ADONewConnection('mssqlnative');
             $db->debug = false;

             $db->Connect($datCon['sServer'], $datCon['UID'], $datCon['PWD'], $datCon['Database']);

            $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

            $rs = $db->Execute($pQry);          

            $rows=$rs->GetRows();

所以,它应该像这样返回和数组

 print_r($rows);
 //Array ([0]=>Array( [Result] => insert )) ) 

但它什么都没打印。

使用Management Studio我已经在我自己的计算机和服务器上直接运行了这个程序,两个案例都检索了数据,所以存储过程没问题。

如果我删除了insert语句:

        create procedure sp_MyTable @id int, @name varchar(100), @type varchar(10)
        as

        declare @Results varchar(100)
         set @Result=@type
         --validations!
        if exists(select * from MyTable where name=@name)begin

        set @Result='No insert:('
        end

        /*
           No insert!
         */


           select @Result Result

有效!。

          print_r($rows);
          //Array ([0]=>Array( [Result] => insert)) ) 

_ UPDATE:即使我在存储过程中打印了某些内容(print'thing'),ADODB也会忽略select语句,因此select必须完全独立。 我想我会考虑寻找另一种方式。 _

PD:抱歉我的英语不好。

问候。

1 个答案:

答案 0 :(得分:0)

嗯,我的生活花了几个小时,但最后我知道发生了什么。

MSSQL 驱动程序用来忽略除最后一个语句之外的所有语句(我记得......)。所以,如果你有这样的东西

    $query="select * from table1; select some, data from table2; select yadda yadda from table3";

    $conn=mysql_connect($sServer,$UID,$PWD);
    $baseDatos=mysql_select_db($Database,$conn);
    $res=mysql_query($query);

        While($row=mssql_fetch_array($res)){
            print($row);
        }

您只会打印 table3 的结果。 ( ACTUALLY 这里写的是你可以有多个recorset并使用mssql http://www.php.net/manual/es/function.mssql-next-result.php浏览它们但是目前我不知道为什么它只需要最后一个第一个。也许它根本不能识别打印或插入作为recorsets

ADODB 库实际上使用 SQLSRV 来处理与任何sql server(mssqlnative)的连接和查询。 SQLSRV是为微软发布的官方驱动程序,因此略有不同。您需要使用sqlsrv_next_result函数,否则它将只返回第一个结果(打印,插入,选择等)

这里的链接 http://www.php.net/manual/en/function.sqlsrv-next-result.php 和另一个有同样问题的人 SQLSRV and multiple selects in Stored Procedure

我的所作所为并不漂亮,但耐心地认为我可以在将来修复它,因为现在我只需要最后一个recorset(table3)而不是第一个,所以......

    /*here my temporary fix*/
        do {
        $result = array();
           while ($row = sqlsrv_fetch_array($this->_queryID)) {
               $result[] = $row;
           }
        } while (!is_null(sqlsrv_next_result($this->_queryID)));

        return $result;
              /**/

我在每个步骤中覆盖变量$ result到结果:)。有趣的代码。

干杯