2017-10-17 55 views
1

我有一個簡單的存儲過程 -PHP/sqlsrv_query資源ID是3,但不返回數據

CREATE PROCEDURE [dbo].[usp_ws_s_GetCargoClearanceApproval_t] 
    @BOLID INT, 
    @ACCOUNTID INT, 
    @TOTALAMOUNT FLOAT OUT, 
    @STORAGEDAYS INT OUT, 
    @ACCOUNTCREDIT FLOAT OUT, 
    @CREDITLIMIT FLOAT OUT 
AS 

BEGIN 
--SET NOCOUNT ON 
    SET @TOTALAMOUNT= '25.00'; SET @STORAGEDAYS = 5; SET @ACCOUNTCREDIT =2500.00; SET @CREDITLIMIT=75000.00 ; 
    SELECT @TOTALAMOUNT,@STORAGEDAYS,@ACCOUNTCREDIT,@CREDITLIMIT; 
END 

這是由一個PHP文件調用並且代碼 -

<?php 
$bol_id = 426863; 
$account_id = 26293; 
$totalamount = 0.00; 
$storagedays = 0; 
$accountcredit = 0.00; 
$creditlimit = 0.00; 

$param1 = array($bol_id, SQLSRV_PARAM_IN); 
$param2 = array($account_id, SQLSRV_PARAM_IN); 

$param3 = array($totalamount, SQLSRV_PARAM_OUT); 
$param4 = array($storagedays, SQLSRV_PARAM_OUT); 
$param5 = array($accountcredit, SQLSRV_PARAM_OUT); 
$param6 = array($creditlimit, SQLSRV_PARAM_INOUT); 


$params = array($param1, $param2, $param3, $param4, $param5, $param6); 

$tsql = "{call usp_ws_s_GetCargoClearanceApproval_t(?,?,?,?,?,?)}"; 

$Account_Transaction_List = array(); 

$connectionInfo = array( "Database"=>'**', "UID"=>'**', "PWD"=>'***'); 
$conn = sqlsrv_connect("**", $connectionInfo); 

if($conn === false) { 
    echo "Couldn't connect to SQL Server on $this->servername.<br />"; 
    die(print_r(sqlsrv_errors(), true)); 
} else { 
    echo "Connected!"; 
} 
echo '<br/>'; 

$result = sqlsrv_query($conn, $tsql, $params); 
echo "<pre/> $result - ";print_r($result); 
echo '<br/>'; 

if ($result !== NULL) { 
    $rows = sqlsrv_has_rows($result); 
    if ($rows === true) 
     echo "\nthere are rows\n"; 
    else 
     echo "\nno rows\n"; 
} 

while($row = sqlsrv_fetch_array($result)) 
{ 
    echo 'IN <br/>'; 
} 

?> 

返回:

連接!

資源ID#3 - 資源ID#3

沒有行

不管我怎麼努力我沒有得到數據。我曾嘗試通過ref傳遞參數,將光標選項設置爲過去兩天的連接和其他排列,但沒有運氣。

有沒有人遇到過這個問題。任何指針將不勝感激。

感謝

+0

您是否嘗試過自行測試存儲過程? – TinkerTenorSoftwareGuy

+0

'資源ID#3'只是表示查詢成功,並不意味着它會返回行。所以一定要親自嘗試一下程序,然後從那裏開始。 – aynber

+0

感謝您關注它們。 sp在sql server management studio上運行時返回值。正如你所看到的,sp本身非常簡單。 –

回答

2

我發現唯一的問題是,$creditlimit設置爲SQLSRV_PARAM_INOUT。我建議在運行查詢後檢查sqlsrv_errors()。可能會有警告返回,從而揭示了這種情況。嘗試這樣的:

<?php 
$bol_id  = 426863; 
$account_id = 26293; 
$totalamount = 0.00; 
$storagedays = 0; 
$accountcredit = 0.00; 
$creditlimit = 0.00; 

$params = [ 
    [$bol_id,  SQLSRV_PARAM_IN], 
    [$account_id, SQLSRV_PARAM_IN], 
    [$totalamount, SQLSRV_PARAM_OUT], 
    [$storagedays, SQLSRV_PARAM_OUT], 
    [$accountcredit, SQLSRV_PARAM_OUT], 
    [$creditlimit, SQLSRV_PARAM_OUT], 
]; 

$conn = sqlsrv_connect("**", ["Database" => "**", "UID"=> "**", "PWD" => "***"]); 

if ($conn === false) { 
    echo "Couldn't connect to SQL Server on $this->servername.<br />"; 
    die(print_r(sqlsrv_errors(), true)); 
} else { 
    echo "Connected!<br/>"; 
} 

$tsql = "{CALL usp_ws_s_GetCargoClearanceApproval_t(?, ?, ?, ?, ?, ?)}"; 

$result = sqlsrv_query($conn, $tsql, $params); 

if ($err = sqlsrv_errors()) { 
    echo "There were errors or warnings!<br/>"; 
    print_r($err); 
    echo "<br/>"; 
} 

if ($result && sqlsrv_has_rows($result)) { 
    echo "There are rows<br/>"; 
} else { 
    echo "There are no rows<br/>"; 
} 

while($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) { 
    print_r($row); 
    echo "<br/>"; 
} 

?> 
+0

謝謝你miken32,它的工作原理。有趣的是,我只是嘗試使用SQLSRV_PARAM_OUT。無論如何,結局不錯。 –

0

顯然,sqlsrv擴展有問題的繪圖數據,這是在SP中計算。以前我讀的SP -

ALTER PROCEDURE [dbo].[usp_ws_s_GetCargoClearanceApproval_t] 
@BOLID INT, 
@ACCOUNTID INT, 
@TOTALAMOUNT FLOAT OUT, 
@STORAGEDAYS INT OUT, 
@ACCOUNTCREDIT FLOAT OUT, 
@CREDITLIMIT FLOAT OUT 
AS 

BEGIN 
--SET NOCOUNT ON 
    set @TOTALAMOUNT= '25.00'; SET @STORAGEDAYS = 5; SET @ACCOUNTCREDIT =2500.00; SET @CREDITLIMIT=75000.00 ; 
    select @TOTALAMOUNT,@STORAGEDAYS,@ACCOUNTCREDIT,@CREDITLIMIT; 
END 

獲取數據我不得不修改SP在這種情況下讀取

select @TOTALAMOUNT as TotalAmount,@STORAGEDAYS as StorageDays,@ACCOUNTCREDIT as AccountCredit,@CREDITLIMIT as CreditLimit; 

我沒有要麼設置輸出參數,可以皆大歡喜:)