Laravel 5.6连接远程MSSQL遇PDOException异常求助
Laravel 5.6连接远程MSSQL时PDOException错误解决办法
问题场景
你用Laravel 5.6连接远程MSSQL,已经装了db_lib驱动和freetds组件,但遇到了这个错误:
PDOException : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute at /home/agner/Documentos/ubuntu-laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:71 public function getServerVersion() 70| { > 71| return PDO::getAttribute(PDO::ATTR_SERVER_VERSION); 72| } Exception trace: 1 PDO::getAttribute() /home/agner/Documentos/ubuntu- laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:71 2 Doctrine\DBAL\Driver\PDOConnection::getServerVersion() /home/agner/Documentos/ubuntu-laravel/vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:496
问题原因
说白了就是Doctrine DBAL组件想调用PDO的PDO::ATTR_SERVER_VERSION属性获取数据库版本,但你的MSSQL PDO驱动不支持这个属性,直接抛出了错误。Laravel在执行迁移、部分查询构建器操作时会用到Doctrine的这个方法。
解决步骤
我之前碰到过一模一样的问题,这么操作就搞定了,亲测有效:
第一步:自定义PDO连接类,覆盖不支持的方法
在你的Laravel项目里新建一个文件app/Database/PDO/SqlServerConnection.php,把下面的代码放进去:<?php namespace App\Database\PDO; use Doctrine\DBAL\Driver\PDOConnection; class SqlServerConnection extends PDOConnection { public function getServerVersion() { // 这里填你的MSSQL实际版本号,比如SQL Server 2017是'14.00.3049',2019是'15.00.2000' // 不知道版本的话,可以在MSSQL里执行 SELECT @@VERSION 查看 return '14.00.3049'; } }第二步:修改数据库配置,指定自定义连接类
打开config/database.php,找到connections数组里的sqlsrv配置项,添加一行driver_class参数:'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'driver_class' => App\Database\PDO\SqlServerConnection::class, // 新增这一行 ],第三步:清除配置缓存(如果之前缓存过)
运行下面的Artisan命令,确保新配置生效:php artisan config:clear第四步:测试连接是否正常
可以写个简单的路由测试一下,比如在routes/web.php里加:Route::get('/test-mssql', function () { // 替换成你数据库里的实际表名 $data = DB::table('your_table')->take(5)->get(); dd($data); });访问这个路由,如果能正常输出数据,就说明问题解决了!
内容的提问来源于stack exchange,提问作者Agner Souza Bezerra
相关产品推荐
相关产品推荐

