2015-08-24 45 views
0

這是我第一次在這裏問過一個問題,但我過去多次使用stackoverflow來查找我在代碼中遇到的問題的解決方案。PHP查詢中的DBCC CHECKIDENT錯誤

我正在上傳csv文件並更新數據庫的php網站上的數據庫傳輸頁面,並且根據更新類型,用戶選擇此數據可以通過鍵更新/插入。因此,我希望在更新完成後運行DBCC CHECKIDENT,以確保新條目在表中最大的鍵後正確遞增。

這是PHP代碼,我跑:

$getMaxID = new Query("SELECT MAX($tableKeys[$t]) as max from $t", __LINE__, __FILE__); 
$maxID = $getMaxID->result(0,'max'); 
$result = new Query("DBCC CHECKIDENT ('$t', RESEED, $maxID)", __LINE__, __FILE__); 

$ t是存儲在表名的數組表名。

我從這個代碼出現以下錯誤:

There has been a system error. We apologize for the inconvienience. 
Error Details: [Microsoft][SQL Server Native Client 11.0][SQL Server]Checking identity information: current identity value '16', current column value '16'. 
Line #: 615 
File: C:\OCPOS\htdocs\OCPOS\menuTransfer\importMenu.php 
Query: DBCC CHECKIDENT ('table', RESEED, 16) 

什麼困惑我的是當我剪了粘貼DBCC CHECKIDENT(「表」,RESEED,16)到Server Management Studio中它的作品,我也得到:

Checking identity information: current identity value '16', current column value '16'. 
DBCC execution completed. If DBCC printed error messages, contact your system administrator. 

如果任何人有什麼原因造成這種任何想法,或者有一個帖子我錯過了解決此問題的任何幫助,將不勝感激。

下面是查詢類。我沒有做它:

class Query{ 
    var $stmt; //hold link to result 
    var $queryStr; //hold string 
    var $queryLine; 
    var $queryFile; 

    function Query($str, $line, $file) 
    { 
     global $conn; 
     $this->queryStr = $str; 
     $this->queryLine = $line; 
     $this->queryFile = $file; 
     $this->stmt = @sqlsrv_query($conn, $this->queryStr, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET)) or $this->error(sqlsrv_errors()); 
    } 

    function error($var) 
    { 
     echo " 
     <p style='border: 1px solid #c00; margin: 5px; padding: 5px;'> 
     There has been a system error. We apologize for the inconvienience.<br/> 
     Error Details: ". $var[0]['message'] ."<br/> 
     Line #: $this->queryLine<br/> 
     File: $this->queryFile<br/> 
     Query: $this->queryStr<br/> 
     </p> 
     "; 
    } 

    function fetch_array() 
    { 
     $array = sqlsrv_fetch_array($this->stmt); 
     if(is_array($array)) 
     return $array; 
     else 
     { 
     return false; 
     } 
    } 

    function fetch_assoc_array() 
    { 
     $array = sqlsrv_fetch_array($this->stmt, SQLSRV_FETCH_ASSOC); 
     if(is_array($array)) 
     return $array; 
     else 
     { 
     return false; 
     } 
    } 


    function num_rows() 
    { 
     return sqlsrv_num_rows($this->stmt); 
    } 

    function numrows() 
    { 
     return $this->num_rows(); 
    } 

    function result($row, $var) 
    { 
     $array = sqlsrv_fetch_array($this->stmt, SQLSRV_FETCH_ASSOC, SQLSRV_SCROLL_FIRST); 
     return $array[$var];    
    } 

     function all() { 
      $return = array(); 
      while ($tmp = $this->fetch_array()) { 
       $return[] = $tmp; 
      } 
      return $return; 
     } 


     function arr() { 
      return $this->fetch_array(); 
     } 

     function getAll() { 
      $return = array(); 
      while ($tmp = $this->fetch_array()) { 
       $return = array_merge($return, $tmp); 
      } 
      return $return; 
     } 

     function extract($var) { 
      $rv = array(); 
      while ($tmp = $this->fetch_array()) { 
       $rv[] = $tmp[$var]; 
      } 
      return $rv; 
     } 

    } 

回答

0

我認爲正在發生的事情是,在PHP數據庫驅動程序是假設從數據庫連接的任何輸出(而非結果集,這是單獨返回)是某種形式的錯誤。請注意,從SQL Server獲得的輸出在兩種情況下實際上是相同的,除了一些額外的上下文信息。在ROW_COUNT設置保持不變的情況下,我看到了類似的問題,文本「rows affected/returned」消息被解釋爲錯誤。

由於DBCC命令,很好地說,不是很標準化,我懷疑是否有任何方法可以在SQL Server端抑制此消息。然而,既然你知道這不是一個真正的錯誤,你應該能夠在PHP方面簡單地忽略它。您已經使用@運算符來壓制PHP自己的錯誤機制,因此只需要Query方法的一個版本,而不需要or $this->error(sqlsrv_errors());。順便提一下,這是一個很好的例子,它仔細分離職責的價值:因爲數據庫抽象類負責將錯誤格式化爲HTML並將其顯示給用戶,所以您或多或少地被迫更改或者替換該邏輯。相反,如果它拋出一個異常,你的調用代碼可以捕獲這個特定的情況,而讓其他人通過一個全局的錯誤處理程序來適當地格式化消息。

+0

謝謝,經過一些測試後,查詢實際上是更新當前的身份值。新版本的查詢是一個好主意 – jhawthorne