当前位置: 首页 > news >正文

Linux平台下使用.NET Core访问Access数据库

运行环境

  • 操作系统:Ubuntu 22.04.3 LTS (Jammy)
  • 开发工具:Visual Studio 2022 (17.8.0)
  • 运行时版本:.NET Runtime 8.0
  • 依赖库:unixodbcmdbtoolsodbc-mdbtools

依赖库安装

apt-get update
sudo apt-get install unixodbc mdbtools odbc-mdbtools

依赖库版本信息

  • apt list --installed | grep odbc
libodbc1/jammy,now 2.3.9-5 amd64 [installed,automatic]
libodbc2/jammy,now 2.3.9-5 amd64 [installed,automatic]
libodbccr2/jammy,now 2.3.9-5 amd64 [installed,automatic]
libodbcinst2/jammy,now 2.3.9-5 amd64 [installed,automatic]
odbc-mdbtools/jammy,now 1.0.0+dfsg-1 amd64 [installed]
odbcinst1debian2/jammy,now 2.3.9-5 amd64 [installed,automatic]
odbcinst/jammy,now 2.3.9-5 amd64 [installed,automatic]
unixodbc-common/jammy,now 2.3.9-5 all [installed,automatic]
unixodbc/jammy,now 2.3.9-5 amd64 [installed]
  • apt list --installed | grep mdb
liblmdb0/jammy,now 0.9.24-1build2 amd64 [installed,automatic]
libmdb3/jammy,now 1.0.0+dfsg-1 amd64 [installed,automatic]
libmdbsql3/jammy,now 1.0.0+dfsg-1 amd64 [installed,automatic]
mdbtools/jammy,now 1.0.0+dfsg-1 amd64 [installed]
odbc-mdbtools/jammy,now 1.0.0+dfsg-1 amd64 [installed]

Linux平台 下的 ODBC 配置

  • /etc/odbc.ini
[access_db] # 随意命名,会在项目代码里用到它
Description=Microsoft Access Database
Driver=MDBW
ServerName = localhost
Database=/root/Database1.mdb # 按你的实际路径改写,要有读写权限
  • /etc/odbcinst.ini
[MDBW] # 随意,在odbc.ini文件用到它
Description=MDBTools Driver Wide # 随意
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmdbodbcW.so # 按你的实际路径改写
Setup=/usr/lib/x86_64-linux-gnu/odbc/libmdbodbcW.so # 按你的实际路径改写
FileUsage=1
UsageCount=1
[MDBTools]
Description=MDBTools Driver # 随意
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmdbodbc.so # 按你的实际路径改写
Setup=/usr/lib/x86_64-linux-gnu/odbc/libmdbodbc.so # 按你的实际路径改写
FileUsage=1
UsageCount=1
[ODBC]
Trace=1
TraceFile=/tmp/mdb.log # 有写入权限的文件路径

 

Demo 项目代码

输出:

UserName: Allen
UserName: Joy

编译和发布

在 OdbcForLinuxTestApp 目录下,执行命令:

dotnet publish -c Release -f net8.0 -r win-x64 -o ./publish/win-x64 # 如果只考虑 Linux平台,该命令可忽略
dotnet publish -c Release -f net8.0 -r linux-x64 -o ./publish/linux-x64

运行 OdbcForLinuxTestApp

注意:Database1.mdb 数据库文件需要提前放到正确的路径,以 odbc.ini文件 的 Database 配置项为准。

cd ./publish/linux-x64
chmod +x OdbcForLinuxTestApp # 授予可执行权限
./OdbcForLinuxTestApp

BASH 复制 全屏

  • Program.cs
    using System.Data;
    using System.Data.Common;
    using System.Data.Odbc;
    using System.Data.OleDb;namespace OdbcForLinuxTestApp;internal sealed class Program
    {static async Task Main(string[] args){string connectionStrings;if (OperatingSystem.IsWindows()){string mdbFile = Path.Combine(AppContext.BaseDirectory, "Database1.mdb");connectionStrings = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={mdbFile}";}else{//root/Database1.mdbconnectionStrings = "DSN=access_db;";}await using (DbConnection conn = GetDbConnection(connectionStrings)){await conn.OpenAsync();DbCommand cmd = conn.CreateCommand();cmd.CommandType = CommandType.Text;cmd.CommandText = "select [ID],[UserName] from Users";DbDataReader reader = await cmd.ExecuteReaderAsync();while (await reader.ReadAsync()){//The MDBTools does not support the use of column namesstring userName = reader.GetString(1);Console.WriteLine("UserName: " + userName);}}}private static string DbProviderName => OperatingSystem.IsWindows() ? "System.Data.OleDb" : "System.Data.Odbc";private static DbConnection GetDbConnection(string connectionStrings){RegisterOdbcOrOleDbFactory();DbProviderFactory dbFactory = DbProviderFactories.GetFactory(DbProviderName);DbConnection? conn = dbFactory.CreateConnection();if (conn == null){return OperatingSystem.IsWindows() ? new OleDbConnection(connectionStrings) : new OdbcConnection(connectionStrings);}conn.ConnectionString = connectionStrings;return conn;}private static int _isRegisteredDbFactory;private static void RegisterOdbcOrOleDbFactory(){if (Interlocked.CompareExchange(ref _isRegisteredDbFactory, 1, 0) == 0){string dbProviderName = DbProviderName;IEnumerable<string> providerInvariantNames = DbProviderFactories.GetProviderInvariantNames();string? invariantName = providerInvariantNames.FirstOrDefault(x => x.Equals(dbProviderName, StringComparison.InvariantCultureIgnoreCase));if (string.IsNullOrWhiteSpace(invariantName)){DbProviderFactories.RegisterFactory(dbProviderName, OdbcFactory.Instance);}}}
    }

    编译和发布 Demo 项目代码

    准备工作

  • 创建 OdbcForLinuxTestApp 目录
  • 将上述两个代码文件放入 OdbcForLinuxTestApp 目录
  • 安装 .NET SDK 8.0.100
http://www.lryc.cn/news/240095.html

相关文章:

  • SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 负载均衡
  • [MySQL-基础]SQL语句
  • CentOS 7实现类似于Kali Linux中的自动补全功能
  • skywalking中gateway的拓扑图没有出现
  • 【前端学java】java中的日期操作(12)
  • 用eclipse搭建简单的JavaWeb环境
  • 【精选】改进的YOLOv5:红外遥感图像微型目标的高效识别系统
  • HarmonyOS ArkTS语言,运行Hello World(一)
  • IDEA中注释快捷键及模板
  • centos7系统下postgresql15离线安装,卸载
  • C#线程 ConcurrentQueue安全队列介绍
  • CURL踩坑记录
  • Python 自动化(十八)admin后台管理
  • Navicat 技术指引 | 适用于 GaussDB 的自动运行功能
  • MySQL 的执行原理(四)
  • PHP 正则式 全能匹配URL(UBB)
  • hadoop shell操作 hdfs处理文件命令 hdfs上传命令 hadoop fs -put命令hadoop fs相关命令 hadoop(十三)
  • redis-cluster集群
  • Hfish安全蜜罐部署
  • Apache POI(Java)
  • P8599 [蓝桥杯 2013 省 B] 带分数(dfs+全排列+断点判断)
  • PS右边的图层窗口没有显示出来?
  • Sealos 云操作系统私有化部署教程
  • 信息系统的安全保护等级的五个级别
  • c语言使用modbus库
  • 【Flask使用】全知识md文档,4大部分60页第3篇:Flask模板使用和案例
  • 芯片的测试方法
  • 网络安全等级保护2.0国家标准
  • 从根到叶:随机森林模型的深入探索
  • python数据结构与算法-15_堆与堆排序