记实现TDengine时序数据库支持 .Net Windows 32位系统踩坑
TDengine是一個高效的存儲、查詢、分析時序大數據的平臺,專為物聯網、車聯網、工業互聯網、運維監測等優化而設計的數據庫, 官方目前沒有提供完整的.Net Core 解決方案, 因此閑來無事, 從基于restful api 到現在使用官方編譯的動態庫實現Maikebing.EntityFrameworkCore.Taos 一路走來, 對.Net 的Ado.Net 以及EF Core 框架有了深刻了解, 無不感嘆?TDengine 的精妙和微軟的設計的偉大之處。?
大家知道之前??Maikebing.EntityFrameworkCore.Taos? 是不支持 32位的, 現在開始, 以及取得了32位? 64位Windows下的支持 以及? Linux64位的支持, 對于32位Windows進展一直不順利。我們中間遇到了兩個問題:
一、查詢時總是報訪問了保護內存:
System.AccessViolationException:“Attempted to read or write protected memory. This is often an indication that other memory is corrupt.”
?跟官方劉工溝通, 我們將?static extern public int Query (long ? taos, string sqlstr); 中的? taos 的類型long改為了 IntPtr , 使用指針的方式進行訪問,? 各種函數調用是沒有問題了。?
二、 32位dll查詢結果在?DataReade中從指針中讀取 Read32 數據是報錯:
一開始只是發現32位dll中, 從指針中用Read32讀取整型時報內存錯誤, 但后面我發現, 只要是第二個字段, 除了主鍵時間字段外, 其余字段的值似乎都不是正確的值,是在找不到原因, 想想可能是返回結果字段是什么樣, 翻到TD源碼中 的字段定義, 懷疑這里是不是有問題
? ? ? ? typedef struct taosField
? ? ? ? {
? ? ? ? ? ? char name[64];
? ? ? ? ? ? short bytes;
? ? ? ? ? ? uint8_t type;
? ? ? ? }
但最后發現, 錯了, 這里是字段描述, 接下來翻了一下返回結果集中的結構, 那么就待看?taos_fetch_row 方法 是如何實現的,taos_fetch_row 的返回值是??typedef void**? TAOS_ROW; 看到這里, 出于長期從事嵌入式?Linux 下C應用開發的第一直覺, 懷疑可能是 指針長度問題, 因為不同的系統不同的編譯器對整型的長度、對內存的對齊是不一樣的, 為什么64位成功, 32位不成功, 懷疑問題可能就在這個指針這里, 百度了一下。? 確實如此, 因為??TAOS_ROW 返回的是個? 二維數組指針, 因此 這個返回結果集中, 32位返回的4字節指針, 64位返回的是 8字節指針, 偏移不一樣, 因此我們在? src\Maikebing.Data.Taos\TaosDataReader.cs?的?GetValuePtr中根據進程是否為64位進程來判斷便宜, 改代碼如下:
? ?public? ?IntPtr GetValuePtr(int ordinal)
? ? ? ? {
? ? ? ? ? ? object result = DBNull.Value;
? ? ? ? ? ? TDengineMeta meta = _metas[ordinal];
? ? ? ? ? ? int offset =? (Environment.Is64BitProcess?8:4) * ordinal;
? ? ? ? ? ?return? Marshal.ReadIntPtr(rowdata, offset);
? ? ? ? }
同樣的方法, 我們修改了?? public override object GetValue(int ordinal) 中的 偏移計算方法!完整啟動 測試項目, OK, 一切一氣呵成。?在這里重申一下, C語言排行榜單又排到第一名, 因此當你熟練C語言之后,在使用其他語言的過程中, 總是有哪些直接會幫助到你。?
Maikebing.EntityFrameworkCore.Taos? 現在已經發布了新版本,你可以通過NuGet管理工具安裝或者通過下面的命令行之一開安裝:?
Install-Package Maikebing.Data.Taos -Version 1.0.53 dotnet add package Maikebing.Data.Taos --version 1.0.53?對于EF Core 中, 你可以通過下面的命令行來安裝至項目:
Install-Package Maikebing.EntityFrameworkCore.Taos -Version 1.0.53 dotnet add package Maikebing.EntityFrameworkCore.Taos --version 1.0.53
GitHub的源碼地址:
https://github.com/maikebing/Maikebing.EntityFrameworkCore.Taos??
碼云的源碼地址:
https://gitee.com/maikebing/Maikebing.EntityFrameworkCore.Taos
附在最后:
生活中有人在問, 你為什么會要把自己寫的代碼公開弄成開源, 寫的好了被其他人用, 自己落不到好, 寫的不好你不嫌人罵你嗎?
我認為既然我從開源社區索取這么多年, 無論工作生活, 開源社區帶給我了大量的機會, 從第一份工作, 到第一份北京的工作, 是社區社區給了我機會, 也是社區讓我的工作能更好的完成。 因此我覺得無論自己代碼寫的好壞, 都是希望對其他人有所幫助, 有些項目Fork有很多, 有些項目 無人問津, 我覺得結果并不重要, 而是在于索取和回饋的過程。?
總結
以上是生活随笔為你收集整理的记实现TDengine时序数据库支持 .Net Windows 32位系统踩坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#9就这么来了,.NET开发者该做点什
- 下一篇: SilkierQuartz 1.0.21