linux環境php調用sqlServer2000存儲過程遇到的問題

  在linux環境中用php查詢sql server並非很常見的需求.通常來講若是必定要用sql server,編程語言我會先c#;若是必定要用php,數據庫我就選mysql.
  這幾天的開發中,須要從一個非開源的erp系統中獲取數據,它使用的數據庫是sql server 2000,並使用了不少存儲過程.咱們要基於這個系統作一些報表類的功能,並把這些功能集成到一個原有的PHP開發的crm系統中.需求來了~
  在linux環境中用php查詢sql server能夠用php自帶的mssql擴展或pdo_dblib擴展,這兩個擴展都須要freetds類庫的支持.
  在程序調試過程當中我繞了不少彎,把裏面幾個重點記錄一下. php

1.tds版本設置

  
參考自:http://cubist.cs.washington.edu/doc/FreeTDS/userguide/x574.htm

我用的是sql server 2000,tds版本應該設置成8.0,修改freetds.conf mysql

[global]
        # TDS protocol version
        # 前面不要帶分號
        tds version = 8.0

調試中發現,若是使用pdo_dblib擴展,這個版本設置沒有什麼影響,設置成幾都能運行;若是使用mssql擴展,這個版本必定要設置成8.0,不然會報錯. linux

2.向表中插入NULL

  
在存儲過程當中用到臨時表. sql

CREATE TABLE [dbo].[#temp2](
	[id] [int] IDENTITY(1,1) NOT NULL,
	title NVARCHAR(50),
	P_money1 MONEY
)

用asp或查詢分析器調用存儲過程向這個表中插入數據時均可以順利執行.但用php調用存儲過程時,報了一個錯: shell

Warning: mssql_execute() [function.mssql-execute]: message: Cannot insert the value NULL into column 'P_money1', table 'tempdb.dbo.#contract_temp2_____________________________________________________________________________________________________00020000006A'; column does not allow nulls.

字段P_money1中不能插入NULL.把表結構修改爲 數據庫

CREATE TABLE [dbo].[#temp2](
	[id] [int] IDENTITY(1,1) NOT NULL,
	title NVARCHAR(50) NULL,
	P_money1 MONEY NULL 
)

後能夠順利插入數據.
用php和freetds調用sql server 2000時,只有把表字段設置成容許爲NULL,才能插入NULL,不然不能插入NULL. 編程

3.存儲過程返回多數據集時的處理

  
當一個存儲過程返回多個數據集時,如: c#

create    proc [dbo].[test]
(	@tb1 varchar(20),
	@tb2 varchar(20)
) 
 as
begin
select * from arealist
select top 2 * from arealist
end

使用mssql擴展的處理方法以下,此方法可順利執行: 服務器

$sql = "test";
#初始化存儲過程
$procedure = mssql_init($sql,$conn);
$var = array("11",'22');
#給存儲過程綁定參數
mssql_bind($procedure, "@tb1", $var[0], SQLVARCHAR,false,false);
mssql_bind($procedure, "@tb2", $var[1], SQLVARCHAR,false,false);
#執行存儲過程
$q = mssql_execute($procedure);
#取得第一個數據集
while($t = mssql_fetch_assoc($q))
    var_dump($t);
#取得第二個數據集
mssql_next_result($q);
echo "<br />--------------------------<br />";  
while($t = mssql_fetch_assoc($q))
    var_dump($t);
mssql_close($conn);

使用pdo_dblib擴展的處理方法: 編程語言

$pdo = new pdo('dblib:host=192.168.3.82;dbname=test', 'sa', '123456');
$sql = "test ?,?";
#初始化存儲過程
$st = $pdo->prepare($sql);
#給存儲過程綁定參數
$var = array("11",'22');
$st->bindparam(1,$var[0],PDO::PARAM_STR);
$st->bindparam(2,$var[1],PDO::PARAM_STR);
#執行存儲過程
$st->execute();
#取得第一個數據集
var_dump($st->fetchall());
echo "<br />--------------------------<br />";  
#取得第二個數據集
$st->nextrowset();
var_dump($st->fetchall());

此方法執行時報了一個錯

Warning: PDOStatement::nextRowset() [pdostatement.nextrowset]: SQLSTATE[IM001]: Driver does not support this function: driver does not support multiple rowsets in /var/www/test3.php on line 17

報錯說:驅動不支持多數據集.服務器上的freetds版本是同樣的,因此是pdo_dblib不能支持獲取多數據集的方法nextrowset.

那它爲何還要提供nextrowset方法呢?多是由於這個方法是由更底層的pdo抽象類提供的,pdo_dblib雖然不能支持它,但也沒作其餘的處理.

相關文章
相關標籤/搜索