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]# 

可以看到程序运行成功。


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

相关推荐
FIN技术铺2 小时前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
矛取矛求3 小时前
Linux如何更优质调节系统性能
linux
霖雨3 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
唐宋元明清21883 小时前
Surface pro 11二合一平板参数调研
windows·外设
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
内核程序员kevin4 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
CodingBrother4 小时前
MySQL 中的 `IN`、`EXISTS` 区别与性能分析
数据库·mysql
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
Ztiddler5 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh