2012-02-29 12 views
5

PHP ile yazılmış bir web uygulaması üzerinde çalışıyorum ve SQL Server 2008 kullanıyor. Veritabanına bağlanmak için Microsoft'un SQLSRV damlasını kullandım. Bu uygulamanın bir kısmında SQL İşlemlerini kullanmam gerekiyor. Microsoft'un önerdiği gibi, tam olarak bu makaleye dayanarak yaptım. Benim kodları ana süreçler aşağıdaki adımları izleyin:
1- jQuery ile PHP dosyaları bilgi göndermek ve JSON tarafından gönderilen sonucu kontrol sql işlem
2- başlayan
3- geri alma sonucu yanlış olduğunu ve sonraki giderseniz doğruysa sorgula.
4- Herhangi bir hata meydana gelmediyse ve tüm sonuçlar tamamlanmamışsa işlemleri gerçekleştirin. Ben SQLSRV sürücü versiyon 2 kullanıyorumPHP ve SQLSRV sürücüsünde "Yeni işleme izin verilmiyor" hatası nedir?

[Microsoft][SQL Server Native Client 10.0][SQL Server] New transaction is not allowed because there are other threads running in the session

:

// This is my pseudo code 
if (sqlsrv_begin_transaction($sqlsrv->sqlsrvLink) === true) { 

    $firstQuery = sqlsrv_query($stmt1); 
    if (!$firstQuery) { 
    sqlsrv_rollback(); 
    } else { 
    $nextQuery = sqlsrv_query($stmt2); 
    if (!$nextQuery) { 
     sqlsrv_rollback(); 
    } else { 
     sqlsrv_commit(); 
    } 
    } 

} else { 
    print_r(sqlsrv_errors()); // Here is where I get the error below. 
} 

Ben sorunu bu hatadır.
Bu hata ne için? Bunu nasıl çözebilirim?

aşağıda yöntemleri içeren index.php ilk bölümü için kendi sqlsrv sınıfı dahil:

function __construct($dbServerName,$dbUsername,$dbPassword,$dbName) 
{ 
    $connectionInfo = array("Database"=> $dbName, "CharacterSet" => "UTF-8"); 
    $this->sqlsrvLink = sqlsrv_connect($dbServerName, $connectionInfo); 
    if ($this->sqlsrvLink === false) { 
     $this->sqlsrvError = sqlsrv_errors(); 
    } 
} 

function __destruct() 
{ 
    sqlsrv_close($this->sqlsrvLink); 
} 
+0

Bu hata ne zaman meydana geliyor: "sqlsrv_query ($ stmt1)" öncesi veya sonrası; "? Bu sözde kodun önündeki bir yerde "sqlsrv_begin_transaction" var mı? – JScoobyCed

+0

@JScoobyCed: Hayır, geçerli yerde olmalı. Bu bir uyarı değil. Bu bir hata. Yani tüm süreçleri durduracak. 2 sorgudan hiçbiri çalışmaz. –

+0

Yani, bu sözde koddan önce "sqlsrv_begin_transaction" için başka bir çağrı var mı, bu nedenle başka bir işlemin zaten başlatılmış olduğunu şikayet ederdi. Kodda hata ayıklamayı denediniz, böylece hangi kod satırında hata oluştuğunu belirleyebilirsiniz. – JScoobyCed

cevap

1

i sql sunucusuna bağlanmak istediğinizde MultipleActiveResultSetstrue ayarlı gerektiğini düşünüyorum:

Hatanızla itibaren
$conn = sqlsrv_connect('127.0.0.1', array 
     (
      'Database' => 'Adventureworks', 
      'MultipleActiveResultSets' => true, // MARS ENABLED 
     )); 

http://php.net/manual/de/ref.pdo-sqlsrv.connection.php

+1

Sorunumu çözmedim ... –

0

, Bu yeni bir işlem i başlıyor $nextQuery = sqlsrv_query($stmt2); gibi görünüyor Aynı seansta. İkinciye başlamadan önce !$firstQuery işleyebilir misiniz?

+1

Colin, öyleyse bu işlem nedir? Kesinlikle hayır. İşlemlerin tüm bölümlerinin kendi operasyonlarında başarı kazanabilmesi için işlemi gerçekleştirmem gerekiyor. –