NETCORE 在LINUX下的DOCKER容器中连接早期的SQL SERVER数据库的问题和解决方案

  • Post author:
  • Post category:linux


1、引子

之前因为把自己的netcore程序部署到docker中运行,由于程序需要连接客户的数据库,比如本文中提到的客户的sql server数据,但是无法确定客户使用的是哪个sql server版本,必须要做到能适配多种数据库。

为了实现这个功能,程序采用了 FreeSQL作为数据服务器的访问框架,可通过配置来适配多种数据库,之前在开发环境下已经适配了oracle、mysql、postgresql、sqlserver,在某些地方部署后,程序运行正常,能正常连接sqlserver数据库。

但是近期一个新客户需要部署程序,对方采用的sqlserver版本不详,部署了程序并运行时,提示无法连接到数据库了,提示的错误如下:

Connection Timeout Expired. The timeout period elapsed during the-login phase. 
The connection could have timed out while waiting for server to complete the 
login process and respond; Or it could have timed out while attempting to 
create multiple active connections. The duration spent while attempting to 
connect to this server was - [Pre-Login] initialization=23; handshake=143; 
[Login] initialization=2; authentication=7; [Post-Login] complete=14021;

2、溯源

在经过多方偿试和搜索后,发现是微软的坑,linux版的sqlclient只支持连接 sqlserver 2008R2 sp3及以上版本的数据库服务,客户所用的数据库很有可能是低于这个版本,这个是硬伤,不可能让客户去升级数据库服务器,临时办法只能是先把程序部署到windows服务器。


Github issue

但是因为程序已经全面容器化部署,不能一个程序单独搞一台windows服务器,问题总还是要解决的,所以就踏上了寻找解决问题的道路上了。

3、解决方案

经过资料查询,要想在linux下连接低版本的sql server只能使用odbc驱动来连接服务器,主要有两种方案,一种是是 odbc配合freetds,另外一种是 odbc配合 ODBC Driver 17 for SQL Server,大概颥要的程序如下:

(1)、unixODBC : 通用的



版权声明:本文为xiaoxinghappy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。