提示 \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
解释:
-
- 配置了一个名称为 win130 的数据源(名字可以随便起,符合实际意义就行),
-
- 指定驱动为 odbcinst.ini 文件中添加的驱动 FreeTDS
-
- 指定服务器名称使用 freetds.conf 配置中的 myWin130。
-
- 制动数据库名称为 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]#
可以看到程序运行成功。