0

这是我第一次在这里提出问题,但过去我曾多次使用 stackoverflow 来解决我在代码中遇到的问题。

我正在上传 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 ('table', RESEED, 16) 剪切到服务器管理工​​作室时,它可以工作,我得到:

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;
      }

  }
4

1 回答 1

0

我相信发生的事情是 PHP 中的数据库驱动程序假设来自数据库连接的任何输出(与单独返回的结果集相反)是某种形式的错误。请注意,在这两种情况下,您从 SQL Server 获得的输出实际上是相同的,除了一些额外的上下文信息。当 ROW_COUNT 设置保持打开状态时,我看到了类似的问题,文本“行受影响/返回”消息被解释为错误。

由于 DBCC 命令,说得好听一点,不是很标准化,我怀疑有什么方法可以在 SQL Server 端抑制此消息。然而,既然你知道这并不是一个真正的错误,你应该能够在 PHP 端简单地忽略它。您已经使用@运算符抑制了 PHP 自己的错误机制,因此只需要一个Query不带or $this->error(sqlsrv_errors());.

顺便说一句,这是仔细分离职责价值的一个很好的例子:由于数据库抽象类负责将错误格式化为 HTML 并将其显示给用户,因此您或多或少被迫更改或替换该逻辑. 相反,如果它抛出异常,您的调用代码可以捕获这个特殊情况,同时让其他人传递给适当格式化消息的全局错误处理程序。

于 2015-08-24T20:06:58.793 回答