【问题标题】:IDENTITY_INSERT is set to OFF errorIDENTITY_INSERT 设置为 OFF 错误
【发布时间】:2015-10-18 21:38:01
【问题描述】:

我正在尝试通过 php 在 mssql db 中插入值。当 IDENTITY_INSERT 设置为 OFF 时,我收到一个错误 Cannot insert explicit value for identity column in。

我添加了查询行来设置 IDENTITY_INSERT 但仍然得到同样的错误。

我用来在 mssql db 中插入值的代码。

   $serverName = "xxxx\SQLEXPRESS"; //serverName\instanceName
   $connectionInfo = array( "Database"=>"xxxx", "UID"=>"xxx", "PWD"=>"xxxx" , "CharacterSet" => "UTF-8");
   $con = sqlsrv_connect( $serverName, $connectionInfo);

   if($con) {
      echo "Connection established";
      }
   else{
        echo "Connection could not be established.";
        die( print_r( sqlsrv_errors(), true));
      }
    $query = "SET IDENTITY_INSERT dbo.xxx ON ";

    $query = "INSERT INTO dbo.xxx([Id],[IdFirma], [VrstaDokumenta], [BrojDokumenta], [BrojDokumentaKroz], 
                            [DatumDokumenta], [IdKupac], [VrstaCijene], [IdKorisnik], [NacinPlacanja], [DatumZadnjeAkcije], [Status], [StatusArhive], 
                            [StatusIzmjene], 
                            [StatusStampe], [VrstaFakture]) 

    VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

    $params = array($id,$IdFirma,$VrstaDokumenta,$BrojDokumenta, $BrojDokumentaKroz, $DatumDokumenta, $IdKupac, $VrstaCijene, $IdKorisnik, 
                    $NacinPlacanja, $DatumZadnjeAkcije, $Status, $StatusArhive, $StatusIzmjene, $StatusStampe, $VrstaFakture);    

    /* Prepare and execute the statement. */

    $stmt = sqlsrv_query( $con, $query, $params);

    if( $stmt === false ) {
         die( print_r( sqlsrv_errors(), true));
    }

我得到的错误:

数组([0] => 数组([0] => 23000 [SQLSTATE] => 23000 [1] => 544 [代码] => 544 [2] => [微软][SQL Server Native Client 11.0][SQL 服务器]无法为表中的标识列插入显式值 'FKNarudzbeKupacaZaglavlje' 当 IDENTITY_INSERT 设置为 OFF 时。 [消息] => [Microsoft][SQL Server Native Client 11.0][SQL 服务器]无法为表中的标识列插入显式值 'FKNarudzbeKupacaZaglavlje' 当 IDENTITY_INSERT 设置为 OFF 时。 ))

有人可以告诉我如何解决这个问题或提供建议吗?

【问题讨论】:

  • 您需要将身份插入设置为开启。希望此链接对您有所帮助。 msdn.microsoft.com/en-us/library/ms188059.aspx
  • 我已经 $query = "SET IDENTITY_INSERT dbo.xxx ON ";
  • 但是你不是用你的实际查询覆盖变量$query 吗?您实际上并没有运行 SET IDENTITY_INSERT 语句 - 您要么需要连接字符串,要么在中间执行查询(不要忘记之后再次关闭身份插入!)
  • 请务必再次将其关闭,否则您将面临很多挑战,因为您一次不能打开超过 1 张桌子。

标签: php sql-server


【解决方案1】:

如果有人遇到类似问题,我会发布解决方案:

$query2 = "SET IDENTITY_INSERT dbo.FKNarudzbeKupacaZaglavlje ON ";

$stmt2 = sqlsrv_query( $con, $query2);

if( $stmt2=== false ) {
die( print_r( sqlsrv_errors(), true));
}

$query = "INSERT INTO dbo.xxx([Id],[IdFirma], [VrstaDokumenta], [BrojDokumenta], [BrojDokumentaKroz],[DatumDokumenta], [IdKupac], [VrstaCijene], [IdKorisnik], [NacinPlacanja], [DatumZadnjeAkcije], [Status], [StatusArhive], [StatusIzmjene], [StatusStampe], [VrstaFakture]) 
          VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

$params = array($id,$IdFirma,$VrstaDokumenta,$BrojDokumenta,
                $BrojDokumentaKroz, $DatumDokumenta, $IdKupac, $VrstaCijene, $IdKorisnik, 
                $NacinPlacanja, $DatumZadnjeAkcije, $Status, $StatusArhive, $StatusIzmjene, $StatusStampe, $VrstaFakture);    

/* Prepare and execute the statement. */

$stmt = sqlsrv_query( $con, $query, $params);

if( $stmt === false ) {
die( print_r( sqlsrv_errors(), true));
}

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2018-05-27
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多