データ持続化Nbear使用経験共有(一)NBEarLiteソースコードとテストDemoを添付

25278 ワード

データの持続化といえば、.netの下でデータの持続化のフレームワークは主に以下のいくつかあります.
   1.NHibernate  2.NBear  3.Castle ActiveRecord  4.iBATIS.NET  5.DAAB
ここでは、Nbearの使用感と経験の共有についてのみ説明します.まず、Nbearがどのようなものかを簡単に紹介します.NBEarは.Net 2.0、C 2.0に基づいてすべてのソースコードをオープンするソフトウェア開発フレームワーククラスライブラリです.NBEarの設計目標は、開発者の作業量を最小限に抑え、開発効率を最大限に向上させ、性能と伸縮性を両立させることです.その主な機能は、データの持続化、IOCなどである.ブログパーク初のオープンソースチームが開発したフレームワークです(そのため、より多くの情報とNbearの異なるバージョンのソースコードを入手したい場合は、ブログパークで直接検索すると見つけやすいです).
    NBEarに触れるのは偶然の機会です.プロジェクト開発中にデータベーステーブルやフィールド名が変更されたためにコードを再生成したり、データ処理層のSQL文(コードジェネレータで生成されていない)を変更したり、SQLが変更を忘れたりしてプログラムが間違っているという問題を避けたいので、手書きのSQLの代わりにいくつかの方法を試してみましょう.(既存のデータ永続化方式を変更する)、ネット上でいくつかのデータ永続化フレームワークを検索し、分析して比較して試用した後、Nbearは使いやすく、拡張性がよく、性能も比較的優れていると感じた.netデータ永続化フレームワーク(NbearのバージョンNBEarLiteは、読み書き性能が比較的高いが、この文の下のコード例はすべてこのバージョンに基づいている).
  
 1  private void TestSelect()
2 {
3 Database db = Databases.NBBS;
4 List<t_Board> resList = null;
5
6 DataSet resSet = Databases.NBBS.Select(NBBS.Tables.t_Board).ToDataSet();
7 Console.WriteLine(resSet.Tables.Count);
8
9 //t_Board t_Board_Model = Databases.NBBS.Select(NBBS.Tables.t_Board).Where(NBBS.Tables.t_Board.Board_ID == 14 && NBBS.Tables.t_Board.Board_Place > 5).ToSingleObject<t_Board>();
10 //Console.WriteLine(t_Board_Model.Board_Name);
11
12 string cmdText = Databases.NBBS.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_ID.Max()).Where(NBBS.Tables.t_Board.Board_Name.Like("nba")).ToDbCommandText();
13
14 cmdText = Databases.NBBS.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_ID.Max().Alias("Max_Id")).Where(NBBS.Tables.t_Board.Board_Name.Like("nb%")).ToDbCommandText();
15 cmdText = Databases.NBBS.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_ID.Max()).Where(NBBS.Tables.t_Board.Board_Name.Like("nb%")).ToDbCommandText();
16 //object obj = Databases.NBBS.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_ID.Max()).Where(NBBS.Tables.t_Board.Board_Name.Like("nb%")).ToDbCommand();
17 //obj = Databases.NBBS.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_ID.Max()).Where(NBBS.Tables.t_Board.Board_Name.Like("nb%")).ToDataReader();
18 int max_Board_ID = Databases.NBBS.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_ID.Max()).Where(NBBS.Tables.t_Board.Board_Name.Like("nb%")).ToScalar<int>();// , ToList
19
20 string cmdText2 = Databases.NBBS.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_ID.Max(), QueryColumn.All()).Where(NBBS.Tables.t_Board.Board_Name == 2).ToDbCommandText();
21
22 resList = db.Select(NBBS.Tables.t_Board, NBBS.Tables.t_Board.Board_Name).GroupBy(NBBS.Tables.t_Board.Board_Name).OrderBy(NBBS.Tables.t_Board.Board_Name.Desc).SetSelectRange(2, 2, NBBS.Tables.t_Board.Board_Name).ToList<t_Board>();
23 ShowListCount(resList);
24
25 //
26 resSet = db.Select(NBBS.Tables.t_Board, QueryColumn.All(NBBS.Tables.t_Board), NBBS.Tables.t_MotherBoard.MotherBoard_Name)
27 .LeftJoin(NBBS.Tables.t_MotherBoard, NBBS.Tables.t_MotherBoard.MotherBoard_ID == NBBS.Tables.t_Board.MotherBoard_ID)
28 .OrderBy(NBBS.Tables.t_Board.Board_ID.Desc).ToDataSet();
29 ShowDataSet(resSet);
30
31 #region MyRegion
32 //ds = db.Select(Northwind.Categories, QueryColumn.All(Northwind.Categories), QueryColumn.All(Northwind.Products))
33 // .Join(Northwind.Products, Northwind.Products.CategoryID == Northwind.Categories.CategoryID)
34 // .Where(Northwind.Categories.CategoryName.Length > 3 && Northwind.Products.UnitPrice > 100)
35 // .OrderBy(Northwind.Categories.CategoryID.Asc, Northwind.Products.ProductID.Desc)
36 // .ToDataSet();
37
38 //ds = db.Select(Northwind.Categories, QueryColumn.All(Northwind.Categories), QueryColumn.All(Northwind.Products))
39 // .LeftJoin(Northwind.Products, Northwind.Products.CategoryID == Northwind.Categories.CategoryID)
40 // .Where(Northwind.Categories.CategoryName.Length > 3 && Northwind.Products.UnitPrice > 100)
41 // .OrderBy(Northwind.Categories.CategoryID.Asc, Northwind.Products.ProductID.Desc)
42 // .ToDataSet();
43
44 //ds = db.Select(Northwind.Categories, QueryColumn.All(Northwind.Categories), QueryColumn.All(Northwind.Products))
45 // .RightJoin(Northwind.Products, Northwind.Products.CategoryID == Northwind.Categories.CategoryID)
46 // .Where(Northwind.Categories.CategoryName.Length > 3 && Northwind.Products.UnitPrice > 100)
47 // .OrderBy(Northwind.Categories.CategoryID.Asc, Northwind.Products.ProductID.Desc)
48 // .ToDataSet();
49
50 //ds = db.Select(Northwind.Categories, Northwind.Categories.__Alias("CategoriesAlias").CategoryName).Join(Northwind.Categories, "CategoriesAlias", Northwind.Categories.CategoryID == Northwind.Categories.__Alias("CategoriesAlias").CategoryID).
51 // SetSelectRange(2, 2, Northwind.Categories.CategoryID).Where(Northwind.Categories.CategoryName.Length > 0 && Northwind.Categories.__Alias("CategoriesAlias").Description != null).
52 // ToDataSet();
53
54 //int pageSize = 10;
55 //int rowCount = (int)db.Select(Northwind.Categories, QueryColumn.All().Count()).ToScalar();
56 //int pageCount = (rowCount % 10 == 0 ? rowCount / 10 : (rowCount / 10) + 1);
57
58 //Console.WriteLine(string.Format("pageSize={0}, rowCount={1}, pageCount={2}", pageSize, rowCount, pageCount));
59
60 ////test select tosingleobject and tolist
61 //_Category cat = db.Select(Northwind.Categories).ToSingleObject<_Category>();
62 ////Dictionary<string, object> dic = db.Select(Northwind.Categories).ToSingleObject<Dictionary<string, object>>();
63 ////Hashtable hash = db.Select(Northwind.Categories).ToSingleObject<Hashtable>();
64 ////NameValueCollection nameval = db.Select(Northwind.Categories).ToSingleObject<NameValueCollection>();
65 //_Category[] cats = db.Select(Northwind.Categories).ToArray<_Category>();
66 //NameValueCollection[] namevals = db.Select(Northwind.Categories).ToList<NameValueCollection>();
67 #endregion
68 }

以上のようにNBEarLiteのクエリーテストコードを使用すると、上を見てみると、その使い方は私たちの手書きSQLと似ていて、使いやすく、カスケードクエリーでもページングクエリーでも機能的にほとんどすべてのデータベースクエリー操作を満たすことができます.
 1   private void TestUpdate()
2 {
3 try
4 {
5 string cmdText = Databases.NBBS.Update(NBBS.Tables.t_Board).AddColumn(NBBS.Tables.t_Board.Board_Name, NBBS.Tables.t_Board.Board_Name + "_" + DateTime.Now).Where(NBBS.Tables.t_Board.Board_ID == null).ToDbCommandText();
6 int n = Databases.NBBS.Update(NBBS.Tables.t_Board).AddColumn(NBBS.Tables.t_Board.Board_Name, NBBS.Tables.t_Board.Board_Name + "_" + DateTime.Now).Where(NBBS.Tables.t_Board.Board_ID == 8).Execute();
7 n = Databases.NBBS.Update(NBBS.Tables.t_Board).AddColumn(NBBS.Tables.t_Board.Board_Name, NBBS.Tables.t_Board.Board_Name + "_" + DateTime.Now).Where(NBBS.Tables.t_Board.Board_ID == "7").Execute();
8 n = Databases.NBBS.Update(NBBS.Tables.t_Board).AddColumn(NBBS.Tables.t_Board.Board_Name, NBBS.Tables.t_Board.Board_Name + "_" + DateTime.Now).Where(NBBS.Tables.t_Board.Board_ID == " ").Execute();// update ,
9 }
10 catch (Exception ex)
11 {
12 throw ex;
13 }
14 }

      以上のようにNBEarLiteを用いた修正テストコードであり,使い方も同様に簡単である.
これに加えて、次のような利点があります.
1.SQLを実行すると、変換されたSQLのパラメータがパラメトリックSQLに変わります.
      2.SQL文を最下位で解析する場合、inputType(クエリなど)に基づいてsqlDataReaderによって結果が返され、そのタイプはsqlDataReader)とoutType(クエリによって返されたPersonエンティティの集合、そのタイプはPerson)などの情報に基づいてタイプ変換(Convert)keyが得られ、類似したSQL操作を実行すると、そのまま(キャッシュ)静的Dictionaryで入手できます.これはパフォーマンスの重要な点です.
Nbearの利点を述べてから、私がなぜ他のフレームワークを採用しないのかについて話します(ツールやフレームワークを使用するには、オプションのどちらが優れているかを比較分析します):
1.NHibernateについて、(javaを習うときにHibernateを使ったことがある)膨大すぎて性能も悪いと感じた.
2.Linq(当時も使いたいと思っていました)は、その書き方も優雅で簡便でしたが、会社の同僚(自分も含めて)はその使い方に熟練しておらず、最終的なSQLをパラメトリックSQL文に変換して実行するかどうかは不明です.C#の文法として、(例えば、変換後のSQL)を使用して、内部の実行状況を把握することができます.
     さて、この文章はここまで书いておきます.研究を深く理解してから、皆さんと分かち合います.文章の后、NBEarLiteソースコードと自分のテストDemoを添付して、兴味のある友达にソースコードを研究することをお勧めします(ソースコードは私が见ました.牛が书いたのは深さがあって、まだ理解していないところがあります)、みんながお互いに交流して勉强することを望んでいます.
  Demoのテスト    NBEarLiteソースコード