• ASP .Net Core 在 CentOS8 ARM 下连接 SQL Server 2008 R2(Hypervisor)


    本文主要记录在 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 包,

      <ItemGroup>
        <PackageReference Include="FreeSql" Version="2.0.102" />
        <PackageReference Include="FreeSql.Provider.Odbc" Version="2.0.102" />
        <PackageReference Include="FreeSql.Provider.SqlServer" Version="2.0.102" />
        <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
      </ItemGroup>

     

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

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

     

    配置连接字符串,appsettings.json

    {
      "ConnectionStrings": {
        "masterConnectionString": "Driver={ODBC Driver 17 for SQL Server};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;",
        "TestConnection": "Driver={ODBC Driver 17 for SQL Server};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;"
      }
    }

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

      ODBC-sql-server

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

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

     

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

      ODBC-linux

     

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

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

     

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

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

    yum install unixODBC.aarch64

     

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

    [root]# odbcinst -j
    unixODBC 2.3.7
    DRIVERS............: /etc/odbcinst.ini
    SYSTEM DATA SOURCES: /etc/odbc.ini
    FILE DATA SOURCES..: /etc/ODBCDataSources
    USER DATA SOURCES..: /root/.odbc.ini
    SQLULEN Size.......: 8
    SQLLEN Size........: 8
    SQLSETPOSIROW Size.: 8

     

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

    [root]# cat /etc/odbcinst.ini
    # Example driver definitions
    
    # Driver from the postgresql-odbc package
    # Setup from the unixODBC package
    [PostgreSQL]
    Description     = ODBC for PostgreSQL
    Driver          = /usr/lib/psqlodbcw.so
    Setup           = /usr/lib/libodbcpsqlS.so
    Driver64        = /usr/lib64/psqlodbcw.so
    Setup64         = /usr/lib64/libodbcpsqlS.so
    FileUsage       = 1
    
    
    # Driver from the mysql-connector-odbc package
    # Setup from the unixODBC package
    [MySQL]
    Description     = ODBC for MySQL
    Driver          = /usr/lib/libmyodbc5.so
    Setup           = /usr/lib/libodbcmyS.so
    Driver64        = /usr/lib64/libmyodbc5.so
    Setup64         = /usr/lib64/libodbcmyS.so
    FileUsage       = 1
    
    
    # Driver from the freetds-libs package
    # Setup from the unixODBC package
    [FreeTDS]
    Description     = Free Sybase & MS SQL Driver
    Driver          = /usr/lib/libtdsodbc.so
    Setup           = /usr/lib/libtdsS.so
    Driver64        = /usr/lib64/libtdsodbc.so
    Setup64         = /usr/lib64/libtdsS.so
    Port            = 1433
    
    
    # Driver from the mariadb-connector-odbc package
    # Setup from the unixODBC package
    [MariaDB]
    Description     = ODBC for MariaDB
    Driver          = /usr/lib/libmaodbc.so
    Driver64        = /usr/lib64/libmaodbc.so
    FileUsage       = 1
    cat /etc/odbcinst.ini

     

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

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

    {
      "ConnectionStrings": {
        "masterConnectionString": "Driver={FreeTDS};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;",
        "TestConnection": "Driver={FreeTDS};Server=tcp:123.123.123.123,1433;UID=user;PWD=pwd; DATABASE=DataTest;"
      }
    }

     

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

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

    # Driver from the freetds-libs package
    # Setup from the unixODBC package

     

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

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

     

    安装 freetds.aarch64 。

    [root]# yum install freetds.aarch64 

     

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

  • 相关阅读:
    python 开发中的常用功能
    python 栈&队列&列表的区别
    python 内置函数简介及其作用
    python 正则表达式详解
    python scrapy
    python 文件操作
    python 爬虫实例
    浅谈tcp 与udp
    php正则匹配video 中或者img的宽度和高度。
    android技术积累:开发规范
  • 原文地址:https://www.cnblogs.com/miaowacao/p/14100506.html
Copyright © 2020-2023  润新知