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.pswp.cn/news/162867.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162867.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162867.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

部署項目時常用的 Linux 命令

目錄 1 前言2 SSH登錄命令3 SCP傳輸命令4 CP拷貝命令5 MV移動命令6 TAR解壓命令7 DU查看文件夾/文件大小8 TAIL查看日志9 NOHUP后臺運行10 結語 1 前言 在應用部署過程中&#xff0c;Linux命令是必不可少的工具。它們能夠幫助我們管理文件、連接服務器、拷貝文件、查看日志以及…

vite項目配置vite.config.ts在打包過程中去除日志

在生產環境上&#xff0c;務必要將日志清除干凈&#xff0c;其因有二&#xff0c;在webgis系統中&#xff0c;有很多幾何數據&#xff0c;體積大、數量多&#xff0c;很容易引起系統卡頓&#xff1b;清除log后&#xff0c;系統看著舒服&#xff0c;協同開發有很多無聊的日志&am…

生日禮物——華為機考真題

題目描述 小牛的孩子生日快要到了&#xff0c;他打算給孩子買蛋糕和小禮物&#xff0c;蛋糕和小禮物各買一個&#xff0c; 他的預算不超過x元。蛋糕 Cake 和小禮物 gift 都有多種價位的可供選擇。 請返回小牛共有多少種購買方案。 輸入描述 第一行表示 Cake的單價, 以逗號分隔 …

字符串:leetcode1410. HTML 實體解析器

1410. HTML 實體解析器 「HTML 實體解析器」 是一種特殊的解析器&#xff0c;它將 HTML 代碼作為輸入&#xff0c;并用字符本身替換掉所有這些特殊的字符實體。 HTML 里這些特殊字符和它們對應的字符實體包括&#xff1a; 雙引號&#xff1a;字符實體為 &quot; &#xff…

一款非常優秀的項目管理工具:進度貓(推薦)

在項目管理中&#xff0c;一個好的工具可以極大地提高效率。 進度貓是一款非常優秀的項目管理工具。它具有非常強大的功能&#xff0c;可以幫助團隊更好地管理項目進度。 通過可視化的方式&#xff0c;將項目進度、任務分配、需求變更等全面呈現給團隊成員&#xff0c;讓團隊…

5.過濾敏感詞 + 發布帖子 + 帖子詳情

目錄 1.過濾敏感詞 1.1 定義前綴樹 1.2 根據敏感詞,初始化前綴樹 1.3 編寫過濾敏感詞方法

需求分析BSA法

&#x1f449;BSA法&#xff08;Basic–Satisfier–Attractor&#xff09;是對客戶需求進行優先級劃分的需求分析方法。該模型體現了需求滿足度和客戶滿意度之間的非線性關系。BSA法將客戶需求分為3種類型&#xff0c;分別是基本型需求、滿意型需求和興奮型需求。下面將對每種需…

ABB機 器 人 操 作 培 訓

目 錄 1 培訓手冊介紹 ---------------------------------------------2 2 系統安全與環境保護 ---------------------------------------------3 3 機器人綜述 ---------------------------------------------5 4 機器人示教 --------------------------------------------12…

哲學家就餐問題(java全代碼)

題目 有N個哲學家圍坐在一張圓桌旁&#xff0c;桌上只有N把叉子&#xff0c;每對哲學家中間各有一把。 哲學家的兩種行為&#xff1a; 一、思考 二、吃意大利面 哲學家只能拿起手邊左邊或右邊的叉子 吃飯需要兩把叉子 正確地模仿哲學家的行為 方法一 一次只允許四個人…

FSCTF2023-Reverse方向題解WP。學習貼

文章目錄 [FSCTF 2023]signin[FSCTF 2023]MINE SWEEPER[FSCTF 2023]Xor[FSCTF 2023]EZRC4[FSCTF 2023]ez_pycxor[FSCTF 2023]Tea_apk[FSCTF 2023]ezcode[FSCTF 2023]ezbroke[FSCTF 2023]rrrrust!!![FSCTF2023]ezrev&#xff08;未解決&#xff09; [FSCTF 2023]signin UPX殼&am…

redis-cluster集群模式

Redis-cluster集群 1 Redis3.0引入的分布式存儲方案 2集群由多個node節點組成,redis數據分布在節點之中,在集群之中分為主節點和從節點3集群模式當中,主從一一對應,數據寫入和讀取與主從模式一樣&#xff0c;主負責寫&#xff0c;從只能讀4集群模式自帶哨兵模式&#xff0c;可…

自然資源土地管理法律法規知識競賽這么辦才高端

近些年&#xff0c;全國各地自然資源廳舉辦了土地管理法律法規知識競賽&#xff0c;從我公司承辦的這些賽事來看&#xff0c;傳統的必答題、搶答題、風險題的方式已無法激起現場比賽氣氛&#xff0c;需要更加復雜有趣的環節設置及高端競賽軟件及其配套設備加持才可以讓知識競賽…

Eigen::Matrix 轉 std::vector 親測ok!

std::vector<double> data;for (int kk 0; kk < 24; kk) {data.push_back(kk);}int n 24 / 3;typedef Eigen::Matrix<double, 3, Eigen::Dynamic> MatrixXd;//vector 轉 matrixEigen::Map<Eigen::MatrixXd> result(data.data(), 3, n);//matrix 轉 vect…

什么是交易量價差分析法?anzo Capital一分鐘講明白

交易量價差分析法是一種深入的市場分析方法&#xff0c;它主要探討了價格、價差和交易量之間的相互關系。在此過程中&#xff0c;交易量主要揭示了市場上的交易活動情況&#xff0c;而價差則反映了這些交易的價格變動。 為了更準確地理解這種關系&#xff0c;定義了交易量價差…

21. Spring擴展點之推斷構造方法

簡介 spring自己本身有推斷構造方法的邏輯&#xff0c;但同時也提供了擴展&#xff0c;SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors&#xff0c;實現該方法就可以自己定制獲取哪個構造器的邏輯&#xff0c;該擴展點spring有一個默認的實現Autow…

單元測試-java.lang.NullPointerException

報錯信息 java.lang.NullPointerException 空指針異常 空對象引用 來源 對Controller層進行單元測試&#xff0c;解決完Spring上下文報錯后繼續報錯。 解決 在測試方法執行前要為字段完成對象的注入&#xff0c;否則就報空指針異常。 測試例子 public class SysUserContr…

前端css粘性布局,頂部吸附效果(position: sticky)

sticky屬性設置 /* 設置粘性布局 */ position: sticky; /* 拖動滾動條&#xff0c;當前元素超出文檔0的位置時&#xff0c;觸發定位效果&#xff08;同級元素位置不會受影響&#xff09; */ top: 0;頁面初始效果 設置前&#xff08;滾動頁面時&#xff0c;標簽欄隨頁面滾動&a…

【深度學習】六大聚類算法快速了解

在機器學習中&#xff0c;無監督學習一直是我們追求的方向&#xff0c;而其中的聚類算法更是發現隱藏數據結構與知識的有效手段。目前如谷歌新聞等很多應用都將聚類算法作為主要的實現手段&#xff0c;它們能利用大量的未標注數據構建強大的主題聚類。本文從最基礎的 K 均值聚類…

【二叉樹進階題目】236. 二叉樹的最近公共祖先,JZ36 二叉搜索樹與雙向鏈表

二叉樹進階題目 236. 二叉樹的最近公共祖先解題思路及實現思路一思路二 JZ36 二叉搜索樹與雙向鏈表描述解題思路及實現 236. 二叉樹的最近公共祖先 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 百度百科中最近公共祖先的定義為&#xff1a;“對于有根樹 T 的兩個…

Axios 攔截器 請求攔截器 響應攔截器

請求攔截器 相當于一個關卡&#xff0c;如果滿足條件就放行請求&#xff0c;不滿足就攔截 響應攔截器 在處理結果之前&#xff0c;先對結果進行預處理&#xff0c;比如&#xff1a;對數據進行一下格式化的處理 全局請求攔截器 axios.interceptors.request.use(config > { /…