ODBC+FreeTDS从Linux访问Windows SqlServer数据库

提示 \color{red}{提示} 提示:
《Linux系统上编译安装FreeTDS库文件》中讲述了如何编译FreeTDS源码,并安装。

本文部分内容会在上述文章的基础上深入。

本文内容所使用的环境

  • Windows系统:Windows 10 企业版 64位操作系统;IP:192.168.1.130
  • Linux系统:BigCloud Enterprise Linux 8.2 (Core);IP:192.168.1.110
  • 数据库:Microsoft SQL Server 2008 (RTM) Enterprise Edition,安装在Windows系统上,默认端口:1433

需求背景

C# .NET8框架的程序运行在Linux系统上,使用技术手段,使得C#程序不仅可以访问Linux系统上的SQLServer数据库,也能访问Windows系统上的SQLServer数据库,以应对复杂的应用场景需求。

注:可能还有很多种方式可以实现需求,这里讲述 ODBC+FreeTDS 的方式。

思路

  • C#程序无法直接使用FreeTDS库文件,但是可以使用ODBC数据库标准接口。
  • ODBC标准接口可以指定使用FreeTDS作为数据库驱动。
  • 这样就可以使用ODBC调用FreeTDS驱动,实现数据库访问。

1.首先验证网络问题

根据文章《FreeTDS从Linux访问Windows SqlServer数据库》中说明验证就可以,这里不在累赘。

2.安装unixODBC包

yum install unixODBC

3.安装unixODBC-devel开发包(后面重新编译FreeTDS会用到)

yum install unixODBC-devel

4.重新编译安装FreeTDS

这里重新编译FreeTDS,是为了使FreeTDS支持ODBC管理,即要生成 libtdsodbc.so 驱动库,方便配置。

根据官网《How to build: Configure and make》章节介绍,在使用 configure 命令时,要加上 --with-unixodbc ,才能生成 libtdsodbc.so 驱动库,使FreeTDS支持ODBC管理。

  • 参数 --with-unixodbc 使用的时候,后面跟 unixODBC-devel 开发包的安装路径,如下:

./configure --prefix=/usr/local --with-tdsver=7.4 --with-unixodbc=/usr --enable-msdblib

--with-unixodbc 参数的路径一定要写对,不然编译不过,会提示找不到sql.h文件。

配置好后就按文章《Linux系统上编译安装FreeTDS库文件》中的介绍编译安装好即可。

5.配置freetds.conf

还是采用文章《FreeTDS从Linux访问Windows SqlServer数据库》中的配置不用变

复制代码
# The server you added yourself
[myWin130]
        host = 192.168.1.130
        port = 1433
        tds version = 7.0

6.配置odbcinst.ini

这个配置文件中,存储了ODBC驱动程序的信息,可以指定驱动程序。

在配置文件中添加如下代码:

复制代码
[FreeTDS]
Description=FreeTDS Driver for Linux
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1

这里,添加了一个别名为 FreeTDS 的驱动(名字可以随便起,符合实际意义就好),这个驱动的信息为:

  • Description:描述字段(随便写),符合实际情况就行
  • Driver:指定使用的驱动程序库文件的位置,这里指定freetds中的odbc驱动支持库文件。
    即上面生成的libtdsodbc.so库的位置。
  • Setup:指定了用于安装驱动程序的设置库文件位置,这里写成和驱动程序库文件一样的即可。
  • UsageCount:默认就好

7.配置odbc.ini

此文件用来配置ODBC的数据源名称,在配置文件中添加如下代码:

复制代码
[win130]
Driver = FreeTDS
Servername = myWin130
Database = fy2000

解释:

    1. 配置了一个名称为 win130 的数据源(名字可以随便起,符合实际意义就行),
    1. 指定驱动为 odbcinst.ini 文件中添加的驱动 FreeTDS
    1. 指定服务器名称使用 freetds.conf 配置中的 myWin130
    1. 制动数据库名称为 fy2000

8.使用isql命令行工具访问数据库

复制代码
[root@localhost ~]# isql -v win130 sa 123456
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| echo [string]                         |
| quit                                  |
|                                       |
+---------------------------------------+
select * from tb_student_info where class>2
+----------------+------------+------------+------------+
| name           | class      | age        | hight      |
+----------------+------------+------------+------------+
| 小红            | 6          | 35         | 130        |
| 小兵            | 3          | 25         | 234        |
+----------------+------------+------------+------------+
SQLRowCount returns 2
2 rows fetched
SQL> quit
[root@localhost ~]# 

到这里配置的ODBC就起作用了。

9.C#-Demo代码

新建 test .NET8 项目,在项目中安装 System.Data.Odbc 软件包,
Program.cs 文件内容如下:

复制代码
using System.Data.Odbc;

string connectionString = "DSN=win130;UID=sa;PWD=123456;";
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
    try
    {
        connection.Open();
        Console.WriteLine("Connection opened successfully.");

        // 执行 SQL 查询  
        string sql = "SELECT * FROM tb_student_info";
        OdbcCommand command = new OdbcCommand(sql, connection);

        using (OdbcDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                // 处理查询结果  
                Console.WriteLine(String.Format("{0}, {1}, {2}, {3}", reader[0], reader[1], reader[2], reader[3]));
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: " + ex.Message);
    }
}

发布到Linux服务器并运行

复制代码
[root@localhost test]# dotnet test.dll
Connection opened successfully.
小美, 2, 18, 123
小红, 6, 35, 130
小兵, 3, 25, 234
[root@localhost test]# 

可以看到程序运行成功。


以上就是本次分享的全部内容,希望对你有帮助,感谢您的查阅。

相关推荐
浪子明X12 分钟前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.15 分钟前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠23 分钟前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
刀客Doc39 分钟前
即时零售不只是多一个渠道,品牌开始重做终端生意
大数据·数据库
就叫飞六吧1 小时前
防抖、幂等、唯一约束三件套 ;
数据库
酸菜。1 小时前
dw_axi_dmac总结
linux
神奇霸王龙1 小时前
Agent 准入门控屠夫:5 旗舰 4 维度评估
linux·运维·数据库·ai·ai作画·agent·ai编程
鲸采云SRM采购管理系统1 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
cfm_29142 小时前
基于Binlog实现不停机数据库平滑迁移技术
运维·数据库·架构
Full Stack Developme2 小时前
SQL 注入 的历史及设计工作原理
数据库·sql