O driver DBLIB PDO falha ao tentar conectar / consultar o banco de dados SQL do Microsoft Azure

2

Estou usando o Linux (ubuntu) e estou tentando conectar-me a um banco de dados SQL do Microsoft Azure.

Informação do servidor:

  • O endereço do servidor é a1a1a1a1a1.database.windows.net (a1a1a1a1a1 é um marcador para o nome do meu servidor)

  • O nome do banco de dados é MyDatabase

  • A tabela é chamada [dbo]. [Preguiça]

Configurações do 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

Quando eu corro

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

no terminal, ele retorna

PDO drivers => dblib, mysql

então, tanto quanto é do meu conhecimento, todas as configurações e instalações de drivers são como deveriam ser.

Então, agora, para os erros:

ERRO 1

Se eu inicializar o PDO da seguinte forma:

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

ele se conecta, mas se eu remover os espaços em torno do caractere '=' para dbname da seguinte forma:

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

ele retorna esses erros da PDOException e 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."

ERRO 2

Quando eu corro o seguinte código

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));
}

quebra na linha $ result = ... com esses erros da PDOException e 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'."

mas quando eu executo a consulta

SELECT * FROM dbo.Sloth

no Portal de Gerenciamento de Banco de Dados do Azure, ele retorna todas as linhas corretas.

Qualquer ajuda com estas questões será muito apreciada!

EDITAR

Por meio de alguns testes, descobri que os dois problemas se originam do fato de que o PDO não está se conectando ao banco de dados, mas sim se conectando ao "mestre". Isso explicaria o erro Nome do Objeto Inválido do ERRO 2.

Alguma idéia de por que o código no ERRO 1 não se conecta ao MyDatabase?

    
por B1NARY 18.11.2013 / 22:24

1 resposta

0

SOLUÇÃO

Eu estava usando o PHP 5.3.10, que tinha o seguinte bug, link

Acontece que o driver do PDO estava fazendo uma instrução USE da qual o Banco de Dados SQL do Microsoft Azure não gosta.

Eu atualizei para o PHP 5.4.21 e tudo funcionou corretamente.

    
por 20.11.2013 / 01:11