尝试连接/查询 Microsoft Azure SQL 数据库时,DBLIB PDO 驱动程序不断失败

尝试连接/查询 Microsoft Azure SQL 数据库时,DBLIB PDO 驱动程序不断失败

所以我正在使用 Linux(ubuntu)并尝试连接到 Microsoft Azure SQL 数据库。

服务器信息:

  • 服务器地址是 a1a1a1a1a1.database.windows.net (a1a1a1a1a1 是我的服务器名称的占位符)

  • 数据库名称为 MyDatabase

  • 该表名为 [dbo].[Sloth]

Freetds.conf 设置:

[global]
    dump file = /tmp/freetds.log
    debug flags = 0xffff
    text size = 64512

[a1a1a1a1a1.database.windows.net]
    host = a1a1a1a1a1.database.windows.net
    port = 1433
    tds version = 8.0
    client charset = UTF-8

当我跑步时

php -r "phpinfo();" | grep "PDO drivers"

在终端它返回

PDO drivers => dblib, mysql

所以据我所知,所有的配置和驱动程序安装都是应该的。

现在来看看错误:

错误 1

如果我像这样初始化 PDO:

$conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);

它可以连接,但如果我删除 dbname 的“=”字符周围的空格,如下所示:

$conn = new \PDO ( "dblib:dbname=MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);

它从 PDOException 和 freetds.log 返回这些错误

SQLSTATE[HY000] General SQL Server error: Check messages from the SQL Server (severity 16)

(dbutil.c:86):msgno 40508: "USE statement is not supported to switch between databases. Use a new connection to connect to a different Database."

错误 2

当我运行以下代码时

try {
    $conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);
    $conn->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
    $statement = $conn->prepare("SELECT * FROM dbo.Sloth");
    $result = $statement->execute();
}
catch ( PDOException $e ) {
    print( "Error connecting to SQL Server." );
    die(print_r($e));
}

它在 $result = ... 行处中断,并出现来自 PDOException 和 freetds.log 的这些错误

SQLSTATE[HY000]: General error: 208 General SQL Server error: Check messages from the SQL Server [208] (severity 16) [(null)] 

(dbutil.c:86):msgno 208: "Invalid object name 'dbo.Sloth'."

但是当我运行查询时

SELECT * FROM dbo.Sloth

在 Azure 数据库管理门户中,它返回所有正确的行。

任何有关这些问题的帮助都将不胜感激!

编辑

通过一些测试,我发现这两个问题都源于 PDO 没有连接到数据库,而是连接到“主服务器”。这可以解释 ERROR 2 的无效对象名称错误。

您对为什么 ERROR 1 中的代码无法连接到 MyDatabase 有什么想法吗?

答案1

解决方案

我使用的是 PHP 5.3.10,它仍然存在以下错误,https://bugs.php.net/bug.php?id=64338

事实证明,PDO 驱动程序正在发出 Microsoft Azure SQL 数据库不喜欢的 USE 语句。

我升级到 PHP 5.4.21 并且一切运行正常。

相关内容