PHP + SQL Server + SQL Server sürücüsü = ciddi bir sorun sqlsrv_num_rows

1 Cevap php

Benim uygulamada ciddi bir sorun var.

Benim SQL Server veritabanı 'CTE' seçeneğini yapmak ve sonra sonuç nesne satır miktarını saymak için sqlsrv_num_rows kullandığınız zaman ben garip bir sonuç var: -1.

Bu değer bile manuel değil (link: http://msdn.microsoft.com/en-us/library/ee376931(SQL.90).aspx).

Örnek kod:

: Örneğin - 'Ortak tablo ifade CTE' W select var

$sql = ";WITH unsorted_cte AS
(
  SELECT
    *
  FROM
    xxx
  WHERE
    yyy
)

SELECT
  u_cte.*
FROM
  [unsorted_cte] u_cte
ORDER BY
    u_cte.[zzzz] ASC";

Sql konsolda @ @ rowcount uygun değeri var, ama biz php komut dosyası bu seçimi kullanabilirsiniz zaman -1 döndürür.

örnek:

// make query with proper coursor

$result = sqlsrv_query($link, $sql, array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET));

// var dump shows us proper resource

var_dump($result):
resource(3) of type (SQL Server Statement)

// sqlsrv_num_rows show us wrong rows count

var_dump(sqlsrv_num_rows($result));
int(-1)

// sqlsrv_errors are empty

var_dump(sqlsrv_errors());
NULL

Ben bütün coursors http://msdn.microsoft.com/en-us/library/ee376927(SQL.90).aspx ve Satırları parametreleri seçilmesi bunu düzeltmek için çalıştı ve ben bunu düzeltmek olamaz.

btw. benim durumumda çalışan tek seçme Satır SQLSRV_CURSOR_FORWARD olduğunu.

My environment: PHP 5.3 MSSQL 2005 Windows Server SQL Server Driver for PHP 1.1 ( msdn dot microsoft dot com/en-us/library/ee229551(SQL.10).aspx) Database encoding: unicode

Ben sb bu sorunun çözümünü biliyorum, umarım.

1 Cevap

Burada anlatılan sorun sqlsrv sürücü inşa edildiği ODBC sürücüsü bir hata ortaya biridir. ODBC sürücüsü sonra yanlış işler ile başlayan SQL sorgu ayrıştırma belli bir düzeyde yapar. Geçici çözüm ODBC sürücüsü tarafından yürütülen kod yolu değiştiren bir saklı yordam olarak sorguyu yürütmek için.

SQL Server yerel istemci takım (SNAC ODBC Microsoft'un uygulama) bu hata farkındadır. Ben bu hata neden olan etkilerinin farkında olduğundan emin olun gerekir.

Teşekkürler.

Brian Swan, Microsoft