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.mdb
                connectionStrings = "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 names
                    string 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

相关推荐
BullSmall4 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存
SelectDB4 小时前
Apache Doris 倒排索引工作原理:全文检索提速 59 倍,点查提速 14 倍
数据库
码农颜4 小时前
5.1.1 原⼦性
数据库·mysql
机建狂魔4 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
山峰哥5 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
moMo5 小时前
# 向量数据库入门:从"关键词匹配"到"语义理解"
数据库
ACP广源盛139246256735 小时前
DeepSeek‑V4‑Flash 公测@ACP#昇腾 950 国产算力组合落地,国产 PCIe 交换芯片 IX9104 有哪些硬件机会
大数据·数据库·人工智能·分布式·单片机·嵌入式硬件·microsoft
深爱水瓶 血影S狂风6 小时前
函数调用过程探究
linux·运维·服务器
进击的女IT6 小时前
通过mysql中的Data目录恢复数据库数据
数据库·mysql
酷可达拉斯6 小时前
Linux操作系统-磁盘空间使用率100%如何处理?
linux·运维·服务器·云计算·bash