情况就是这样:我正在使用Zend Framework 2连接到Oracle数据库。我已经指定'Pdo_Oci'作为我的适配器的驱动程序。我正在使用Select对象来构建查询并执行它们。
一切都很顺利,直到我尝试在Select对象上使用limit方法。由于我正在与Oracle交谈,并且Oracle没有LIMIT,我希望框架生成一个对Oracle有意义的sql字符串并模拟LIMIT(我猜是使用ROWNUM)。
但是,生成的sql只有LIMIT关键字,当然执行时会出现错误,因为我的数据库不知道如何处理它。
所以,我看到了两种可能性:
1)我的期望是错误的,而limit()方法只是LIMIT的一个简单包装器,不能与Oracle数据库一起使用。像this one这样的帖子似乎暗示情况并非如此,但我可能读错了。
2)我做错了什么。我应该使用其他驱动程序吗?
编辑:在回答ZF2学生的问题时,还希望为人们提供更多帮助我的背景:
我没有明确地形成连接字符串。我只是在local.php中有必要的db配置:
return array(
'db' => array(
'driver' => 'Pdo_Oci',
'database' => 'my_database_host',
'username' => 'my_user_name',
'password' => 'my_password'
),
);
在我的global.php中,我设置了一个适配器工厂:
return array(
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
),
'aliases' => array(
'db' => 'Zend\Db\Adapter\Adapter',
),
),
);
我在控制器中检索适配器,如下所示:
$db = $this->getServiceLocator()->get('db');
答案 0 :(得分:0)
我设法解决了这个问题,但这要归功于Zend Framework的2.1更新。显然在2.0中没有提供oci特定的驱动程序。我的'pdo_oci'尝试实际上默认为通用pdo驱动程序。
使用zf 2.1。,我正在指定我的连接:
'db' => array(
'driver' => 'oci8',
'username' => 'myUser',
'password' => 'myPW',
'connection' => '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = myHost)(PORT = myPort))
)
(CONNECT_DATA =
(SERVICE_NAME = myService)
)
)'
)
2.1框架将使用Zend \ Db \ Adapter \ Driver \ Oci8命名空间中的类,它们将正确使用oci8扩展 - 仍需要在php.ini中启用 - 并为其创建正确的sql限制和抵消方法。
我希望这有助于其他人。