[C#] 初探 iBoxDB 建立資料,列出所有 Tables ,查詢資料

2022-11-15


最近再研究一些其他的資料庫做快取用,我在想除了 SQLite 還有啥選擇,這時候我看到 wiki 有寫到一個 nosql 的資料庫叫做 iBoxDB 也支持 C#

就想說研究一下,想說順手筆記一下





首先,你只需要引入一個  library : iBoxDB

 



順手測試一些東西,寫了一個物件 叫做 User 如下,接下來會建立兩張 Table 分別為 USERS1 , USERS2  然後分成奇數偶數寫入

Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "db1"); var boxDB = new IBoxDB.LocalServer.DB(AppDomain.CurrentDomain.BaseDirectory + "db1"); boxDB.GetConfig().EnsureTable<User>("USERS1", "Id"); boxDB.GetConfig().EnsureTable<User>("USERS2", "Id"); var auto = boxDB.Open(); Console.WriteLine("=============================== INSERT DATA =============================== "); //Create for (var j = 1; j <= 10; j++) { var user = new User { Id = "DONMA-ID-" + j, Name = "許當麻", Birth = DateTime.Now, Friends = new List<User>(), Salary = (111.11m * j) }; for (var i = 1; i <= 5; i++) { user.Friends.Add(new User { Id = "DONMA-FRIEND" + i, Name = "許當麻朋友" + i, Birth = DateTime.Now.AddYears(-i), Friends = new List<User>(), Salary = i * 100 }); } var resCreate = false; if (j % 2 != 0) { resCreate = auto.Insert("USERS1", user); } else { resCreate = auto.Insert("USERS2", user); } Console.WriteLine("Create Result " + j + ":" + resCreate); } //Result: //Create Result 1:True //Create Result 2:True //Create Result 3:True //Create Result 4:True //Create Result 5:True //Create Result 6:True //Create Result 7:True //Create Result 8:True //Create Result 9:True //Create Result 10:True


1. 寫入篇 ,這時候我指定程式執行的跟目錄 db1 當作資料放置位置,之後就是寫入的部分,寫入十筆並且我在 Friends 都有放入一些 User物件們做測試

Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "db1"); var boxDB = new IBoxDB.LocalServer.DB(AppDomain.CurrentDomain.BaseDirectory + "db1"); boxDB.GetConfig().EnsureTable<User>("USERS1", "Id"); boxDB.GetConfig().EnsureTable<User>("USERS2", "Id"); var auto = boxDB.Open(); Console.WriteLine("=============================== INSERT DATA =============================== "); //Create for (var j = 1; j <= 10; j++) { var user = new User { Id = "DONMA-ID-" + j, Name = "許當麻", Birth = DateTime.Now, Friends = new List<User>(), Salary = (111.11m * j) }; for (var i = 1; i <= 5; i++) { user.Friends.Add(new User { Id = "DONMA-FRIEND" + i, Name = "許當麻朋友" + i, Birth = DateTime.Now.AddYears(-i), Friends = new List<User>(), Salary = i * 100 }); } var resCreate = false; if (j % 2 != 0) { resCreate = auto.Insert("USERS1", user); } else { resCreate = auto.Insert("USERS2", user); } Console.WriteLine("Create Result " + j + ":" + resCreate); } //Result: //Create Result 1:True //Create Result 2:True //Create Result 3:True //Create Result 4:True //Create Result 5:True //Create Result 6:True //Create Result 7:True //Create Result 8:True //Create Result 9:True //Create Result 10:True


2.取出所有的 TABLES

Console.WriteLine("=============================== GET ALL TABLES =============================== "); //Get All Tables var res = boxDB.Open().GetDatabase().GetSchemata(); foreach (var t in res) { if (!t.Key.Contains("__")) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(t.Key + ":" + t.Value); Console.ResetColor(); } else { Console.WriteLine(t.Key + ":" + t.Value); } }


Result:



3.透過 Key 查找資料

var resGetData = auto.Get<User>("USERS2", "DONMA-ID-2"); Console.WriteLine(JsonConvert.SerializeObject(resGetData)); //=============================== 取得資料by KEY =============================== //{"Id":"DONMA-ID-2","Name":"許當麻","Birth":"2022-11-15T12:20:31.3568287+08:00","Salary":222.22,"Friends":null}


4.查詢範圍的資料 Salary >=400 && Salary <=700

Console.WriteLine("=============================== 搜尋範圍資料 =============================== "); var resDataRange = auto.Select("from USERS2 where Salary >=? && Salary<=?", 400m, 700m); foreach (var user in resDataRange) { Console.WriteLine(JsonConvert.SerializeObject(user)); } //=============================== 搜尋範圍資料 =============================== //{"Birth":"2022-11-15T12:20:31.366535+08:00","Id":"DONMA-ID-6","Name":"許當麻","Salary":666.66} //{"Birth":"2022-11-15T12:20:31.360662+08:00","Id":"DONMA-ID-4","Name":"許當麻","Salary":444.44}


5.取得 USER2 Table 中所有資料

Console.WriteLine("=============================== GET ALL TABLES =============================== "); var res = boxDB.Open().GetDatabase().GetSchemata(); foreach (var t in res) { if (!t.Key.Contains("__")) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(t.Key + ":" + t.Value); Console.ResetColor(); } else { Console.WriteLine(t.Key + ":" + t.Value); } } /* =============================== 取得所有資料 =============================== {"Birth":"2022-11-15T12:20:31.3672558+08:00","Id":"DONMA-ID-8","Name":"許當麻","Salary":888.88} {"Birth":"2022-11-15T12:20:31.366535+08:00","Id":"DONMA-ID-6","Name":"許當麻","Salary":666.66} {"Birth":"2022-11-15T12:20:31.360662+08:00","Id":"DONMA-ID-4","Name":"許當麻","Salary":444.44} {"Birth":"2022-11-15T12:20:31.3568287+08:00","Id":"DONMA-ID-2","Name":"許當麻","Salary":222.22} {"Birth":"2022-11-15T12:20:31.3706268+08:00","Id":"DONMA-ID-10","Name":"許當麻","Salary":1111.10} */


6.透過 LINQ  查詢 Id 包含某關鍵字資料

Console.WriteLine("=============================== 找尋關鍵字 =============================== "); var resContainData = from o in auto.Cube().Select<User>("from USERS2") where o.Id.Contains("D-4") select o; foreach (var user in resContainData) { Console.WriteLine(JsonConvert.SerializeObject(user)); } //=============================== 找尋關鍵字 =============================== //{"Id":"DONMA-ID-4","Name":"許當麻","Birth":"2022-11-15T12:20:31.360662+08:00","Salary":444.44,"Friends":null}


這裡面比較詭異的就是我放得 Friends 都是 null 不過這樣設計本來就不是很好建議應該是 mapping 才對

先主要分享到這裡,如果有其他發現的我在繼續寫下去..


參考文獻:

https://www.bookstack.cn/read/iBoxDB/143003

https://blog.51cto.com/u_15162069/2760340

https://www.cxyzjd.com/article/lile1234_show/78771292

https://github.com/iboxdb/iboxdb.github.io

https://iboxdb.github.io/




當麻許的碎念筆記 2014 | Donma Hsu Design.