本文主要记录在 ARM 系统下无法连接SQL Server 2008 R2 的解决过程。

解决方案是使用 ODBC 的方式连接数据库,进行操作。

手上有公司的华为鲲鹏云计算 ARM 架构的 CentOS8 服务器,

想要在上面部署 ASP .Net Core WebAPI 站点,连接数据库。

同事在使用 SqlSugar 连接数据库时,无法连接,找我讨论解决方案。

参考资料     GitHub(Issues)

并根据以上资料给出了结论,

无法连接是因为 SqlSugar 里连接数据库的包是 System.Data.SqlClient,

而这个包在 Linux 系统下最低只支持 SP3。

解决方案只能给服务器系统打上 SP3 的补丁,

  或者将 SQL Server 2008 SP2 升级为 2012。

这个结论第一反应就是,XX微软,又坑人。

但是我记得 SqlClient 这个包改过一次名字,Microsoft.Data.SqlClient ,

除了系统打补丁和升级数据库,在代码层面上,应该有别的解决方案。

我自己常用的ORM框架是 FreeSQL,它是支持 SQL Server 2005 的。

FreeSql.Provider.SqlServer 基于 SqlServer 2005+

果断把我自己的项目放到ARM服务器上试了试。结果不太行,也是无法连接。

连接阿里云ECS上的 MySQL 时,可以正常连接数据库。

但是在连接 SQL Server 2008 时,一直提示无法连接到数据库。

在咨询 叶老板 后,他建议我试试 ODBC 模式。

就去查了下这个模式是什么,以及和 SqlClient 的区别。

What are the pros and cons of OleDB versus SQLClient?

感觉可以试试看,就开始折腾。

最终是实现了数据库的连接。

在 nuget 安装 FreeSql.Provider.Odbc 包,

  1. <ItemGroup>
  2. <PackageReference Include="FreeSql" Version="2.0.102" />
  3. <PackageReference Include="FreeSql.Provider.Odbc" Version="2.0.102" />
  4. <PackageReference Include="FreeSql.Provider.SqlServer" Version="2.0.102" />
  5. <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  6. </ItemGroup>

代码中修改,将 FreeSqlBuilder 的 DataType 从 SqlServer 切换成 OdbcSqlServer

  1. IFreeSql freeSql = new FreeSqlBuilder()
  2. .UseConnectionString(DataType.OdbcSqlServer, Configuration.GetConnectionString("TestConnection"))
  3. .UseAutoSyncStructure(true)
  4. .Build();

配置连接字符串,appsettings.json

  1. {
  2. "ConnectionStrings": {
  3. "masterConnectionString": "Driver={ODBC Driver 17 for SQL Server};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;",
  4. "TestConnection": "Driver={ODBC Driver 17 for SQL Server};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;"
  5. }
  6. }

注意,ODBC的连接字符串是特殊的,参考资料:

ODBC-sql-server

这里为什么会有两个连接字符串,在使用 FreeSQL ODBC 的时候,

一直提示 masterConnectionString 字段没有值,我暂时没处理,想解决核心关键问题。

接下来是要在目标服务器上安装 ODBC,参考资料:

ODBC-linux

由于服务器是 ARM 架构,所要安装 UnixODBC

  1. [root]# yum search unixODBC
  2. Last metadata expiration check: 2:52:58 ago on Mon 07 Dec 2020 08:40:34 PM CST.
  3. ==================================================================== Name Exactly Matched: unixODBC =====================================================================
  4. unixODBC.aarch64 : A complete ODBC driver manager for Linux
  5. =================================================================== Name & Summary Matched: unixODBC ====================================================================
  6. unixODBC-devel.aarch64 : Development files for programs which will use the unixODBC library
  7. ======================================================================== Name Matched: unixODBC =========================================================================
  8. freeradius-unixODBC.aarch64 : Unix ODBC support for freeradius
  9. ======================================================================= Summary Matched: unixODBC =======================================================================
  10. erlang-odbc.aarch64 : A library for unixODBC support in Erlang
  11. [root]#

这里搜索 yum 源,因为服务器是ARM64架构,

需要找到 aarch64 的包进行安装,执行安装指令。

  1. yum install unixODBC.aarch64

安装完成后,执行命令,查看配置信息。

  1. [root]# odbcinst -j
  2. unixODBC 2.3.7
  3. DRIVERS............: /etc/odbcinst.ini
  4. SYSTEM DATA SOURCES: /etc/odbc.ini
  5. FILE DATA SOURCES..: /etc/ODBCDataSources
  6. USER DATA SOURCES..: /root/.odbc.ini
  7. SQLULEN Size.......: 8
  8. SQLLEN Size........: 8
  9. SQLSETPOSIROW Size.: 8

安装的 ODBC 驱动都保存在 /etc/odbcinst.ini ,进行打印查看。

  1. [root]# cat /etc/odbcinst.ini
  2. # Example driver definitions
  3.  
  4. # Driver from the postgresql-odbc package
  5. # Setup from the unixODBC package
  6. [PostgreSQL]
  7. Description = ODBC for PostgreSQL
  8. Driver = /usr/lib/psqlodbcw.so
  9. Setup = /usr/lib/libodbcpsqlS.so
  10. Driver64 = /usr/lib64/psqlodbcw.so
  11. Setup64 = /usr/lib64/libodbcpsqlS.so
  12. FileUsage = 1
  13.  
  14. # Driver from the mysql-connector-odbc package
  15. # Setup from the unixODBC package
  16. [MySQL]
  17. Description = ODBC for MySQL
  18. Driver = /usr/lib/libmyodbc5.so
  19. Setup = /usr/lib/libodbcmyS.so
  20. Driver64 = /usr/lib64/libmyodbc5.so
  21. Setup64 = /usr/lib64/libodbcmyS.so
  22. FileUsage = 1
  23.  
  24. # Driver from the freetds-libs package
  25. # Setup from the unixODBC package
  26. [FreeTDS]
  27. Description = Free Sybase & MS SQL Driver
  28. Driver = /usr/lib/libtdsodbc.so
  29. Setup = /usr/lib/libtdsS.so
  30. Driver64 = /usr/lib64/libtdsodbc.so
  31. Setup64 = /usr/lib64/libtdsS.so
  32. Port = 1433
  33.  
  34. # Driver from the mariadb-connector-odbc package
  35. # Setup from the unixODBC package
  36. [MariaDB]
  37. Description = ODBC for MariaDB
  38. Driver = /usr/lib/libmaodbc.so
  39. Driver64 = /usr/lib64/libmaodbc.so
  40. FileUsage = 1

cat /etc/odbcinst.ini

这里可以看到,连接数据库使用的 MS SQL Driver 的名称是 FreeTDS ,

就需要修改连接字符串里的驱动名称。

  1. {
  2. "ConnectionStrings": {
  3. "masterConnectionString": "Driver={FreeTDS};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;",
  4. "TestConnection": "Driver={FreeTDS};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;"
  5. }
  6. }

驱动配置里有两行注释的提示语,嗯,这两句是有用的,

意思是想要启动 unixODBC ,需要 freetds-libs 库。

  1. # Driver from the freetds-libs package
  2. # Setup from the unixODBC package

根据提示,搜索 freetds ,找到了 freetds.aarch64 。

  1. [root]# yum search freetds
  2. Last metadata expiration check: 0:11:31 ago on Mon 07 Dec 2020 11:41:19 PM CST.
  3. ===================================================================== Name Exactly Matched: freetds =====================================================================
  4. freetds.aarch64 : Implementation of the TDS (Tabular DataStream) protocol
  5. ==================================================================== Name & Summary Matched: freetds ====================================================================
  6. freetds-libs.aarch64 : Libraries for freetds
  7. freetds-doc.noarch : Development documentation for freetds
  8. freetds-devel.aarch64 : Header files and development libraries for freetds
  9. [root]#

安装 freetds.aarch64 。

  1. [root]# yum install freetds.aarch64

接下来就可以使用 FreeSQL.ODBC 正常访问数据库了。

ASP .Net Core 在 CentOS8 ARM 下连接 SQL Server 2008 R2(Hypervisor)的更多相关文章

  1. VS2013连接SQL Server 2008 R2测试

    第一步,打开SQL Server 08,这里要说明一下,一定要开启服务,很多时候我们重启电脑以后,SQL Server的保留进程会被类似电脑管家之类的保护程序关闭,于是乎连接了半天的数据库都连不上. ...

  2. Win8.1下安装sql server 2008 r2详解

    我是来斗图的,安装了好多次,有一些配置还是不能烂熟于心啊,所以就想起来了米老师那句话,学习是个反复的过程.写个教程吧,很简单但是很实用. 首先打开"setup.exe"出现以下界面 ...

  3. ASP.NET Core使用NLog记录日志到Microsoft Sql Server

    在之前的文章中介绍了如何在ASP.NET Core使用NLog,本文为您介绍在ASP.NET Core使用NLog记录到Microsoft Sql Server 1.我们需要添加依赖: NLog.We ...

  4. Ubuntu下erlang连接SQL SERVER 2008

    erlang连接SQL Server使用ODBC方法,但在网络上还是缺少资料,自己折腾了2天才成功.现在特记录下来,以供大家借鉴. 基本思路是 erlang odbcserver + unixodbc ...

  5. SQL Server 2008 R2如何开启数据库的远程连接

    SQL Server 2008 R2如何开启数据库的远程连接 SQL Server 2005以上版本默认是不允许远程连接的,如果想要在本地用SSMS连接远程服务器上的SQL Server 2008,远 ...

  6. php连接sql server 2008数据库

    原文:php连接sql server 2008数据库 关于php连接sql server 2008的问题,2000的版本可以直接通过php中的配置文件修改,2005以上的版本就不行了,需要使用微软公司 ...

  7. phpstudy连接SQL Server 2008数据库 以及 php使用sql server出现乱码解决方式

    开始也尝试自己配置php安装环境,找到一个详细的百度经验http://jingyan.baidu.com/article/154b46315242b328ca8f4101.html,前面有问题也一一去 ...

  8. 【netcore入坑记】 .Net core UseRowNumberForPaging 分页报错 SQL Server 2008 R2 EntityFrameworkCore

    异常环境: netcore版本:.Net Core 2.1 efcore版本:Microsoft.EntityFrameworkCore.SqlServer 2.1.1 sql sqlserver 版 ...

  9. .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”

    一.  问题说明 最近.Net EF core 程序部署到服务器,服务器数据库安装的是SQL server 2008 R2,我本地用的的是SQL server 2014,在用到分页查询时报错如下: H ...

随机推荐

  1. netty系列之:让TLS支持http2

    目录 简介 TLS的扩展协议NPN和ALPN SslProvider ApplicationProtocolConfig 构建SslContext ProtocolNegotiationHandler ...

  2. Google Style Guides

    Google Style Guides Google Style Guides Google 开源项目风格指南 (zh-google-styleguide.readthedocs.io)

  3. UE4蓝图AI角色制作(七)之追逐玩家

    15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...

  4. 【UE4 设计模式】命令模式 Command Pattern

    概述 描述 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作. 命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务 ...

  5. [对对子队]会议记录4.10(Scrum Meeting 1)

    本次每日例会的开会时间是4月10日晚上20:00,使用腾讯会议作为开会工具. 今天已完成的工作 何瑞 ​ 工作内容:制作UI界面的指令编辑系统,已大致实现指令的衔接 ​ 相关issue:实现用户指令编 ...

  6. Exynos4412 中断处理流程详解

    Linux 中,当外设触发中断后,大体处理流程如下: a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler; b - ...

  7. Apache Kafka 学习笔记

    1. 介绍Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动 ...

  8. 求树的直径【两遍BFS】

    两遍BFS.从任意一个点出发,第一遍可以找到直径的一端,从这端出发即可找到另外一端. 证明:从U点出发,到达V[画个图便清晰了] 1.如果U在直径上,则V一定是直径的一个端点. 2.如果U不在直径上. ...

  9. hdu 1078 FatMouse and Cheese(记忆搜)

    N*N的矩阵,每个格子上有一个值. 老鼠起始在(1,1),每次只能水平着走或垂直着走.且最多只能走K步.且走到的格子里的值必须比上一次呆的格子里的值大. 问老鼠最多收集到多少值. 思路: 记忆搜好写. ...

  10. hdu 2176 取(m堆)石子游戏 (裸Nim)

    题意: m堆石头,每堆石头个数:a[1]....a[m]. 每次只能在一堆里取,至少取一个. 最后没石子取者负. 先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法.如果从有a个 ...