PHP 查询中的 DBCC CHECKIDENT 错误
DBCC CHECKIDENT error in PHP query
这是我第一次在这里提问,但我过去曾多次使用 Whosebug 来寻找我在代码中遇到的问题的解决方案。
我正在 php 网站上的数据库传输页面上工作,该页面上传 csv 文件并更新数据库,根据用户选择的更新类型,此数据可以是 updated/inserted按键。因此,我想在进行更新后 运行 DBCC CHECKIDENT 以确保新条目将在 table.
中的最大键之后正确递增
这是我运行宁的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 是存储在 table 个名称数组中的 table 个名称。
我从这段代码中得到以下错误:
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.
如果有人知道是什么原因造成的,或者如果有 post 我错过了解决此问题的方法,我们将不胜感激。
下面是查询 class。我没有成功:
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;
}
}
我相信正在发生的事情是 PHP 中的数据库驱动程序假设来自数据库连接的任何输出(与单独返回的结果集相反)都是某种形式的错误。请注意,您从 SQL 服务器获得的输出在这两种情况下实际上是相同的,除了一些额外的上下文信息。当 ROW_COUNT 设置保持打开时,我看到了类似的问题,文本 "rows affected/returned" 消息被解释为错误。
由于 DBCC 命令,说得好听一点,不是很标准化,我怀疑是否有任何方法可以在 SQL 服务器端抑制此消息。但是,既然您知道这并不是真正的错误,那么您应该能够在 PHP 端简单地忽略它。您已经使用 @
运算符抑制 PHP 自身的错误机制,因此只需要一个没有 or $this->error(sqlsrv_errors());
.
的 Query
方法版本
顺便说一句,这是仔细分离职责的价值的一个很好的例子:由于数据库抽象 class 负责将错误格式化为 HTML 并将其显示给用户,您或多或少被迫改变或替换该逻辑。相反,如果它抛出一个异常,您的调用代码可以捕捉到这种特殊情况,同时让其他代码传递给适当格式化消息的全局错误处理程序。
这是我第一次在这里提问,但我过去曾多次使用 Whosebug 来寻找我在代码中遇到的问题的解决方案。
我正在 php 网站上的数据库传输页面上工作,该页面上传 csv 文件并更新数据库,根据用户选择的更新类型,此数据可以是 updated/inserted按键。因此,我想在进行更新后 运行 DBCC CHECKIDENT 以确保新条目将在 table.
中的最大键之后正确递增这是我运行宁的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 是存储在 table 个名称数组中的 table 个名称。
我从这段代码中得到以下错误:
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.
如果有人知道是什么原因造成的,或者如果有 post 我错过了解决此问题的方法,我们将不胜感激。
下面是查询 class。我没有成功:
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;
}
}
我相信正在发生的事情是 PHP 中的数据库驱动程序假设来自数据库连接的任何输出(与单独返回的结果集相反)都是某种形式的错误。请注意,您从 SQL 服务器获得的输出在这两种情况下实际上是相同的,除了一些额外的上下文信息。当 ROW_COUNT 设置保持打开时,我看到了类似的问题,文本 "rows affected/returned" 消息被解释为错误。
由于 DBCC 命令,说得好听一点,不是很标准化,我怀疑是否有任何方法可以在 SQL 服务器端抑制此消息。但是,既然您知道这并不是真正的错误,那么您应该能够在 PHP 端简单地忽略它。您已经使用 @
运算符抑制 PHP 自身的错误机制,因此只需要一个没有 or $this->error(sqlsrv_errors());
.
Query
方法版本
顺便说一句,这是仔细分离职责的价值的一个很好的例子:由于数据库抽象 class 负责将错误格式化为 HTML 并将其显示给用户,您或多或少被迫改变或替换该逻辑。相反,如果它抛出一个异常,您的调用代码可以捕捉到这种特殊情况,同时让其他代码传递给适当格式化消息的全局错误处理程序。