1

我在需要通过 PDO 连接到 MSSQL 数据库的环境中试用 Fat Free Framework。我写了一些代码来测试数据库查询功能。这是我的第一次尝试:

$f3->route('GET /datasets/read', function($f3) {
    $db = new DB\SQL('sqlsrv:Server=192.168.**.**;Database=test',"sa","*****");

    $results = $db->exec('SELECT * FROM builds');
    var_dump($results);
});

这工作正常。我看到builds表中所有记录的一个很好的转储。到目前为止,一切都很好。

我尝试的下一件事是使用框架提供的 ORM 方法:

$f3->route('GET /datasets/read', function($f3) {
    $db = new DB\SQL('sqlsrv:Server=192.168.**.**;Database=test',"sa","*****");

    $builds =new DB\SQL\Mapper($db,'builds')
    $builds->load();
});

然而,这失败了。生成的查询没有字段(这是生成的确切查询:)SELECT FROM builds,导致:

内部服务器错误

PDOStatement:[Microsoft][SQL Server Native Client 11.0][SQL Server] 关键字“FROM”附近的语法不正确:

[call stack]...[/call stack]

我在这里做错了什么吗?我无法想象连接字符串有问题,因为它在使用原始 SQL 方法时能够很好地检索数据。启用表到实体映射是否需要某种配置?

我正在按照此处提供的指南进行操作,以供参考。

4

1 回答 1

0

我稍微翻了一下日志,发现正在执行以下查询来检索表模式:

SELECT c.column_name     AS field, 
       c.data_type       AS type, 
       c.column_default  AS defval, 
       c.is_nullable     AS nullable, 
       t.constraint_type AS pkey 
FROM   information_schema.columns AS c 
       LEFT OUTER JOIN information_schema.key_column_usage AS k 
                    ON c.table_name = k.table_name 
                       AND c.column_name = k.column_name 
                       AND c.table_schema = k.table_schema 
       LEFT OUTER JOIN information_schema.table_constraints AS t 
                    ON k.table_name = t.table_name 
                       AND k.constraint_name = t.constraint_name 
                       AND k.table_schema = t.table_schema 
WHERE  c.table_name = 'builds' 
       AND c.table_schema = 'test****';

该查询试图强制该table_schema字段包含数据库名称!难怪它没有找到任何列。从这里转到lib/db/sql/sql.php并更改第 249 行:

($this->engine=='pgsql'?
'c.table_catalog':'c.table_schema').

对此:

($this->engine=='pgsql'||$this->engine== 'sqlsrv'?
'c.table_catalog':'c.table_schema').

解决问题。我不知道其他数据库如何存储指示数据库名称的字段,所以我认为最好保守一点,只对我确信需要的 SQL 服务器数据库进行此更改。

于 2014-02-28T04:11:23.447 回答