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.130port = 1433tds 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]#
可以看到程序运行成功。
以上就是本次分享的全部内容,希望对你有帮助,感谢您的查阅。
相关文章:
ODBC+FreeTDS从Linux访问Windows SqlServer数据库
提示 \color{red}{提示} 提示: 《Linux系统上编译安装FreeTDS库文件》中讲述了如何编译FreeTDS源码,并安装。 本文部分内容会在上述文章的基础上深入。 本文内容所使用的环境 Windows系统:Windows 10 企业版 64位操作系统;IP&a…...
Chainlit一个快速构建成式AI应用的Python框架,无缝集成与多平台部署
概述 Chainlit 是一个开源 Python 包,用于构建和部署生成式 AI 应用的开源框架。它提供了一种简单的方法来创建交互式的用户界面,这些界面可以与 LLM(大型语言模型)驱动的应用程序进行通信。Chainlit 旨在帮助开发者快速构建基于…...
leetcode日记(51)不同路径Ⅱ
和上一道题(无障碍物的最短路径)很像,但事实上比上一题多了优化方法 根据上一题改的代码如下,添加了对障碍物的判定,如果有障碍物则将数组值设为0。 class Solution { public:int uniquePathsWithObstacles(vector&l…...
图解分布式事务中的2PC与Seata方案
文章目录 文章导图什么是2PC解决传统2PC方案XA方案DTP模型举例:新用户注册送积分总结: Seata方案设计思想执行流程举例:新用户注册送积分 Seata实现2PC事务(AT模式)前提整体机制写隔离读隔离实际案例理解要点说明核心代…...
数据结构(Java):Map集合Set集合哈希表
目录 1、介绍 1.1 Map和Set 1.2 模型 2、Map集合 2.1 Map集合说明 2.2 Map.Entry<K,V> 2.3 Map常用方法 2.4 Map注意事项及实现类 3、Set集合 3.1 Set集合说明 3.2 Set常用方法 3.3 Set注意事项及其实现类 4、TreeMap&TreeSet 4.1 集合类TreeM…...
网络战时代的国家安全:策略、技术和国际合作
网络战时代的国家安全涉及到策略、技术和国际合作等多个方面。以下是对这些问题的简要概述: 网络战策略 网络战策略是指在现代战争中,通过网络技术进行的信息收集、处理、分析、调度和指挥等一系列行动,旨在同时影响和干扰对方的网络系统&am…...
【elasticsearch实现优先展示连词并按某个字段折叠显示最新一条】
elasticsearch实现优先展示连词并按某个字段折叠显示最新一条 前言match_phrase 顺序前缀 boost 权重collapse 折叠基本用法高级功能排序 前言 场景要求: 优先展示关键词连词的商品按照某个字段折叠相同字段,并按指定排序字段选择第一个 match_phras…...
Golang | Leetcode Golang题解之第284题窥视迭代器
题目: 题解: type PeekingIterator struct {iter *Iterator_hasNext bool_next int }func Constructor(iter *Iterator) *PeekingIterator {return &PeekingIterator{iter, iter.hasNext(), iter.next()} }func (it *PeekingIterator) hasNe…...
C语言中的结构体
文章目录 前言一、结构体是什么?二、结构体的定义三、结构体的初始化四、结构体的嵌套五、结构体数组 1结构体数组的定义:六、结构体指针 一、结构体是什么? 我们知道一群类型相同的数据组合到一起是数组,那一群不同类型的数据组…...
3.qml与c++模块化开发
目录 模块化开发封装c模块并使用封装qml模块并使用 模块化开发 什么是模块化开发呢? 举个例子: 我们有一台台式电脑,我们台式电脑有显卡,内存,磁盘,cpu,键盘,鼠标等 你可以将这些部…...
怎么使用github上传XXX内所有文件
要将 目录中的所有文件上传到 GitHub,你可以按照以下步骤进行: 创建一个新的 GitHub 仓库 登录到你的 GitHub 账户。 点击右上角的加号(),选择 “New repository”。 输入仓库名称(例如:202407…...
合作伙伴中心Partner Center中添加了Copilot预览版
目录 一、引言 二、Copilot 功能概述 2.1 Copilot 简介 2.2 Copilot 的核心功能 2.3 Copilot 的访问和使用 三、Copilot 的使用方法 3.1 Copilot 功能区域 3.2 Copilot 使用示例 3.2.1 编写有效提示 3.2.2 使用反馈循环 四、负责任的人工智能 4.1 Copilot 结果的可…...
Navidrome音乐服务器 + 音流APP = 释放你的手机空间
20240727 By wdhuag 目录 前言: 参考: Navidrome音乐服务器 Demo试用: 支持多平台: 下载: 修改配置: 设置用NSSM成服务启动: 服务器本地访问网址: 音流 歌词封面API&am…...
Prometheus安装部署
文章目录 1.Prometheus(普罗米修斯)安装部署1.1部署环境准备1.2部署prometheus1.3主机数据展示 2.Grafana安装部署2.1部署Grafana2.2配置Grafana数据源2.2配置Grafana仪表板 3.AlertManager安装部署3.1部署alertmanager3.2告警邮件发送配置3.3测试邮件告警效果3.4自定义邮件告警…...
算法(查找算法---二分查找/索引查找/哈希表查找)
二、查找算法 什么是查找算法: 在一个数据序列中,查找某个数据是否存在或存在的位置,在实际开发过程中使用的频率非常高,例如对数据常见的操作有增、删、改、查,增加数据时需要查询新增加的数据是否重复,…...
SQL labs-SQL注入(二)
环境搭建参考 SQL注入(一) 一,SQL labs-less2。 http://192.168.61.206:8001/Less-2/?id-1 union select 1,2,group_concat(username , password) from users-- 与第一关没什么太大的不同,唯一区别就是闭合方式为数字型。 二…...
go 语言踏出第一步
1、下载Go语言安装包:在官方网站(https://golang.org/dl/)上下载适合你操作系统的Go语言安装包。选择一个tar.gz格式的包。 2、解压安装包:打开终端,进入下载目录,并使用以下命令解压安装包: ta…...
SpringBoot-21 SpringBoot微服务的发布与部署(3种方式)
基于 SpringBoot 的微服务开发完成之后,现在到了把它们发布并部署到相应的环境去运行的时候了。 SpringBoot 框架只提供了一套基于可执行 jar 包(executable jar)格式的标准发布形式,但并没有对部署做过多的界定,而且为…...
在occluded Person Re-ID中,选择clip还是ViT作为backbone?
在遮挡行人再识别(Occluded Person Re-Identification, Occluded Person Re-ID)任务中,使用CLIP(Contrastive Language-Image Pre-Training)作为backbone和使用Vision Transformer(ViT)作为back…...
Linuxnat网络配置
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
