運行環境
- 操作系統:
Ubuntu 22.04.3 LTS (Jammy)
- 開發工具:
Visual Studio 2022 (17.8.0)
- 運行時版本:
.NET Runtime 8.0
- 依賴庫:
unixodbc
、mdbtools
、odbc-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