2

我使用 ZendFramework 和 PHP 版本 5.4.12,我的操作系统是 Windows 7。我的连接参数是

resources.db.adapter = "sqlsrv"
resources.db.params.pdoType = "mssql"

但我有这个例外

Fatal error: Uncaught exception 'Exception' with message '[Microsoft][SQL Server Native Client 11.0]SQL Server Native Client 11.0 does not support connections to SQL Server 2000 or earlier versions.'

因为我使用最新的 php 驱动程序。

如何连接到 MS SQL Server 2000(版本 8.00.760)?

4

2 回答 2

3

我有一些仍在运行 SQL Server 2000 的数据库,我不想为其他人恢复到旧驱动程序。经过一番探索,这是我能想到的最佳解决方法:通过 ADO 使用 OLEDB 连接到 SQL Server 2000 数据库。ADO 是一个 COM 组件,因此您需要启用COM_DOT_NET扩展。

我已经验证这仍然适用于安装了 Native Client 11 的 Windows Server 2008 R2 下的 PHP 5.4。

<?php
$conn =  new COM("ADODB.Connection") or die("Cannot create ADO COM object");
$conn->Open("Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=True;Data Source=LOCALHOST;Initial Catalog=master");
//$conn->Open("Provider=SQLOLEDB;User ID=username;Password=password;Persist Security Info=True;Data Source=host.example.com;Initial Catalog=databasename"); 
$rs = $conn->Execute("SELECT 1 as Number,GetDate() as Date, CAST(0 as bit) as Boolean, 'hello world' as String");
$fieldnames = []; 
$rows = [];
while (!$rs->EOF){
  $fieldnames = []; // wasteful, redoing this each time
  $thisrow = [];
  for ($i=0;$i<($rs->Fields->Count);$i++)  {
    $field = $rs->Fields[$i];
    $fieldname = (string) $field->Name;
    $type = $field->Type;
    // field->Type is the ADO type; due personal weakness I am only handling types I actually need 
    if ($type == 3 || $type == 20) {
      $value = (integer) $field->Value;
    } elseif ($type == 4 || $type==5) {
      $value = (float) $field->Value;
    } elseif ($type == 11) {
      $value = (boolean) $field->Value;
    } else {
    $value = (string) $field->Value;
    }
    $thisrow[] = $value; //array by index
    $thisrow[$fieldname] = $value; // array by name
    $fieldnames[]=$fieldname;
  }
  $rows[] = $thisrow;
  $rs->MoveNext();
}
$rs->Close(); 
$conn->Close();
echo "your fieldnames are, in column order:\n";
var_dump($fieldnames);
echo "your data is, in record order:\n";
var_dump($rows);
?>

笔记:

  • 这仅适用于 Windows 下的 PHP。
  • 您需要启用 PHP COM_DOT_NET 扩展。乌格。请参阅这篇文章了解如何操作。
  • devnetwork.net 上的这篇文章对于展示如何在 PHP 下使用 ADO 至关重要。
  • 使用 ADO 的技巧是数据作为 COM 变体返回。使用 ADO 的最快方法是调用 GetRows() 并将返回的变体转换为 2D 变体数组并从那里开始,但我无法让 PHP 使用它。(这是上述链接中的“DrDev”问题。)
  • 为避免出现问题,我遍历每一行的每个字段并显式转换为数据 PHP 类型。(这可以做得更好,但这些都是我关心的所有 ADO 类型。)

待办事项:参数化查询。我多么希望我可以将这些主机更新到 SQL Server 2012 Express Edition...

于 2014-02-17T22:44:44.517 回答
1

因为您使用的是 SQL Server Native Client(版本 11)的 2012 版,它不再支持您的 SQL Server 的 2000 版。是的,这是一种耻辱。

要解决此问题,您应该下载可以在此处找到的早期版本:http: //www.microsoft.com/en-us/download/details.aspx?id=16978

查找部分

Microsoft® SQL Server® 2008 R2 本机客户端

还是不行,需要先卸载2012版本。

如果它仍然不起作用,请看这里:http ://www.sqlservercentral.com/Forums/Topic1317581-2799-1.aspx

于 2013-03-17T09:39:26.407 回答