Dos.ORM(原Hxj.Data)於2009年發佈,併發布實體生成工具。在開發過程參考了多個ORM框架,特別是NBear,MySoft、EF、Dapper等。吸取了他們的一些精華,加入自己的新思想。該組件已在上百個成熟企業項目中應用 首先·在 App.config文件中配置連接資料庫字元串。或者在
Dos.C#.Net使用
Dos.ORM(原Hxj.Data)於2009年發佈,併發布實體生成工具。在開發過程參考了多個ORM框架,特別是NBear,MySoft、EF、Dapper等。吸取了他們的一些精華,加入自己的新思想。該組件已在上百個成熟企業項目中應用
為什麼選擇Dos.ORM(原Hxj.Data)?
- 上手簡單,0學習成本。使用方便,按照sql書寫習慣編寫C#.NET代碼。功能強大
- 高性能(與Dapper媲美,接近手寫Sql)
- 體積小(不到150kb,僅一個dll)
- 完美支持Sql Server(2000至最新版),MySql,Oracle,Access,Sqlite等資料庫
- 支持大量Lambda表達式寫法,國產ORM支持度最高,開源中國ORM排行前三
- 不需要像NHibernate的XML配置,不需要像EF的各種資料庫連接驅動
- 眾多成熟企業軟體、互聯網項目已應用此框架
- 遵循MIT開源協議,除不允許改名,其它隨意定製修改
- Dos團隊持續更新升級,任何Bug反饋都會立即得到解決
首先·在 App.config文件中配置連接資料庫字元串。或者在程式中指定
1 <connectionStrings> 2 <add name="School" connectionString="Data Source=.;Initial Catalog=School;User ID=sa;Pwd=123;"></add> 3 </connectionStrings>
然後,進行增刪改操作。如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Hxj.Data; 7 using Hxj.Data.Sqlite; 8 using System.Data; 9 10 namespace cn.School 11 { 12 class Test 13 { 14 static void Main(string[] args) 15 { 16 17 // <connectionStrings> 18 //<add name="School" connectionString="Data Source=.;Initial Catalog=School;User ID=sa;Pwd=123;"></add> 19 //</connectionStrings> 20 21 //不同的資料庫可構造不同的DbSession DbSession(connectionStrings節點的name) 22 //DbSession dbs = new DbSession("School"); 23 DbSession dbs2 = new DbSession(DatabaseType.SqlServer, "Data Source=.;Initial Catalog=School;User ID=sa;Pwd=123;"); 24 25 //TestSelDB(); 26 27 //addTestDB(); 28 29 //Updata(); 30 31 //DelData(); 32 33 //sqlFrom(); 34 35 assistmethod(); 36 } 37 38 /// <summary> 39 /// 查詢操作 40 /// </summary> 41 public static void TestSelDB() 42 { 43 //查詢Student表中第一條數據並返回實體,代碼如下。 44 Student st = DbSession.Default.From<Student>() 45 //.Select(Products._.ProductID) //查詢返回ProductID欄位 46 //.GroupBy(Products._.CategoryID.GroupBy && Products._.ProductName.GroupBy)//按照CategoryID,ProductName分組 47 //.InnerJoin<Suppliers>(Suppliers._.SupplierID == Products._.SupplierID)//關聯Suppliers表 --CrossJoin FullJoin LeftJoin RightJoin 同理 48 //.OrderBy(Products._.ProductID.Asc)//按照ProductID正序排序 49 //.Where((Products._.ProductName.Contain("apple") && Products._.UnitPrice > 1) || Products._.CategoryID == 2)//設置條件ProductName包含”apple”並且UnitPrice>1 或者CategoryID =2 50 //.UnionAll(DbSession.Default.From<Products>().Select(Products._.ProductID))//union all查詢 51 //.Distinct() // Distinct 52 //.Top(5) //讀取前5條 53 //.Page(10, 2)//分頁返回結果 每頁10條返回第2頁數據 54 //.ToDataSet(); //返回DataSet 55 //.ToDataReader(); //返回IDataReader 56 //.ToDataTable(); //返回DataTable 57 //.ToScalar(); //返回單個值 58 .ToFirst(); 59 60 //分欄位查詢 61 DbSession.Default.From<Student>() 62 .Select(Student._.Stu_ID, Student._.Stu_name) 63 .ToDataTable(); 64 65 //分欄位查詢取別名 66 DbSession.Default.From<Student>() 67 .Select(Student._.Stu_ID, Student._.Stu_name.As("pname")) 68 .ToDataTable(); 69 70 //排序倒敘排列 71 DataTable dt = DbSession.Default.From<Student>().OrderBy(Student._.Stu_ID.Desc).ToDataTable(); 72 73 } 74 75 /// <summary> 76 /// 模糊查詢 77 /// 子查詢 78 /// in 查詢 79 /// not iN查詢 80 /// </summary> 81 public static void demoSelet() 82 { 83 84 //Contain完全模糊查詢 85 DbSession.Default.From<Student>().Where(Student._.Stu_ID.Contain(41500)); 86 87 //查找Stu_ID列中所有以41500開頭的。 88 DbSession.Default.From<Student>().Where(Student._.Stu_ID.BeginWith(41500)); 89 90 //查找Stu_ID列中所有以41500結尾的。 91 DbSession.Default.From<Student>().Where(Student._.Stu_ID.EndWith(41500)); 92 93 //in 查詢 94 DbSession.Default.From<Student>() 95 .Where(Student._.Stu_ID.SelectIn(1, 2, 3)) 96 .ToList(); 97 98 //not in查詢 99 DbSession.Default.From<Student>() 100 .Where(Student._.Stu_ID.SelectNotIn<int>(1, 2, 3)) 101 .ToList(); 102 103 //子查詢 104 105 //SubQueryEqual = 106 //SubQueryNotEqual <> 107 //SubQueryLess < 108 //SubQueryLessOrEqual <= 109 //SubQueryGreater > 110 //SubQueryGreaterOrEqual >= 111 //SubQueryIn in 112 //SubQueryNotIn not in 113 DbSession.Default.From<Student>() 114 .Where(Student._.Stu_ID 115 .SubQueryEqual(DbSession.Default.From<Student>().Where(Student._.Stu_ID == "Produce").Select(Student._.Stu_ID).Top(1))) 116 .ToList(); 117 } 118 119 /// <summary> 120 /// 聯合查詢 121 /// </summary> 122 public static void likeSel() 123 { 124 //InnerJoin inner join 125 //LeftJoin left join 126 //RightJoin right join 127 //CrossJoin cross join 128 //FullJoin full join 129 //Union union 130 //UnionAll union all 131 DbSession.Default.From<Student>() 132 .InnerJoin<Gread>(Student._.gr_id == Gread._.gr_id) 133 .ToDataTable(); 134 //聯合查詢帶條件 135 DbSession.Default.From<Student>() 136 .LeftJoin<Gread>(Student._.gr_id == Gread._.gr_id) 137 .Where(Student._.gr_id == 1) 138 .ToDataTable(); 139 140 //這兩個是兩個結果的合集,union會區分結果排除相同的,union all 則直接合併結果集合。 141 142 DbSession.Default.From<Student>().Where(Student._.gr_id == 4522) 143 .UnionAll(DbSession.Default.From<Gread>().Where(Gread._.gr_id == 1)) 144 .ToList(); 145 } 146 147 /// <summary> 148 /// 增加操作 149 /// </summary> 150 public static void addTestDB() 151 { 152 //新建一個實體 153 Student stu = new Student(); 154 stu.Stu_name = "小黑"; 155 stu.stu_phon = "1254555"; 156 stu.stu_Sex = "男"; 157 stu.stu_Age = 25; 158 stu.gr_id = 1; 159 160 //開啟修改 (開啟修改後的添加操作將只insert賦值過的欄位) 161 stu.Attach(); 162 163 //返回值 如果有自增長欄位,則返回自增長欄位的值 164 int result = DbSession.Default.Insert<Student>(stu); 165 166 //將插入的數據查詢出來 167 List<Student> listStu = DbSession.Default.From<Student>().Where(Student._.Stu_ID == result).ToList(); 168 } 169 170 /// <summary> 171 /// 修改操作 172 /// </summary> 173 public static void Updata() 174 { 175 //先查詢一個Student對象 176 Student stu = DbSession.Default.From<Student>().Where(Student._.Stu_ID.Contain(41500)).ToFirst(); 177 178 //開啟修改 (修改操作之前 必須執行此方法) 179 stu.Attach(); 180 181 stu.Stu_name = "王五"; 182 List<ModifyField> list = stu.GetModifyFields(); 183 //清除修改記錄 (清除後更新操作無效) 184 //stu.ClearModifyFields(); 185 //返回0表示更新失敗 組件有事務會自動回滾 186 //返回1表示更新成功 187 //更新成功返回值就是受影響的條數 188 int num = DbSession.Default.Update<Student>(stu); 189 190 191 //簡單的修改方法,修改一個值的時候使用 192 //int nums = DbSession.Default.Update<Student>(Student._.Stu_name, "九九", Student._.Stu_ID == 41501); 193 194 195 //修改多個值的時候 196 //Dictionary<Field, object> st = new Dictionary<Field, object>(); 197 //st.Add(Student._.stu_Sex, "男"); 198 //st.Add(Student._.Stu_name, "小徐"); 199 //int returnvalue = DbSession.Default.Update<Student>(st, Student._.Stu_ID == 41501); 200 } 201 202 203 /// <summary> 204 /// 刪除操作 205 /// </summary> 206 public static void DelData() 207 { 208 209 int returnValue = DbSession.Default.Delete<Student>(Student._.Stu_ID == 41504); 210 //與上面等效的刪除語句 211 //int returnvalue = DbSession.Default.Delete<Student>(2); 212 213 214 //刪除一個對象 215 //Student stu = DbSession.Default.From<Student>().ToFirst(); 216 //int returnvalue = DbSession.Default.Delete<Student>(stu); 217 } 218 219 220 /// <summary> 221 /// 使用SQL語句查詢 222 /// </summary> 223 public static void sqlFrom() 224 { 225 226 //直接使用SQL語句查詢 227 DataTable dt = DbSession.Default.FromSql("select * from Student").ToDataTable(); 228 229 //參數化SQL語句 230 //DataTable dt1 = DbSession.Default.FromSql("select * from Student where stu_id=id").AddInParameter("id", DbType.Int32, 41500).ToDataTable(); 231 232 //多個參數查詢 233 //DataTable dt2 = DbSession.Default.FromSql("select * from Student where stu_id=id or stu_name=name") 234 // .AddInParameter("id", DbType.Int32, 41500) 235 // .AddInParameter("name", DbType.String, "張三") 236 // .ToDataTable(); 237 } 238 239 240 /// <summary> 241 /// 存儲過程 242 /// </summary> 243 public static void ProcDemo() 244 { 245 //"ProcName"就是存儲過程名稱。 246 DataTable dt = DbSession.Default.FromProc("ProcName").ToDataTable(); 247 248 249 //執行帶參數的存儲過程 250 DataTable dt1 = DbSession.Default.FromProc("ProcName") 251 .AddInParameter("parameterName", DbType.DateTime, "1995-01-01") 252 .AddInParameter("parameterName1", DbType.DateTime, "1996-12-01") 253 .ToDataTable(); 254 255 256 257 //AddInputOutputParameter 方法添加輸入輸出參數 258 //AddOutParameter 方法添加輸出參數 259 //AddReturnValueParameter 方法添加返回參數 260 261 ProcSection proc = DbSession.Default.FromProc("testoutstore") 262 .AddInParameter("in1", System.Data.DbType.Int32, 1) 263 .AddOutParameter("out2", System.Data.DbType.String, 100); 264 proc.ExecuteNonQuery(); 265 266 Dictionary<string, object> returnValue = proc.GetReturnValues(); 267 268 foreach (KeyValuePair<string, object> kv in returnValue) 269 { 270 Console.WriteLine("ParameterName:" + kv.Key + " ;ReturnValue:" + Convert.ToString(kv.Value)); 271 } 272 } 273 274 /// <summary> 275 /// 輔助方法 276 /// </summary> 277 public static void assistmethod() 278 { 279 //返回 Student._.Stu_name == "小黑" 的Student._.gr_id合計。 280 int? sum = (int?)DbSession.Default.Sum<Student>(Student._.gr_id, Student._.Stu_name == "小黑"); 281 282 //返回 Student._.Stu_ID == 2 的Stu_ID平均值。 283 DbSession.Default.Avg<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 284 285 //返回 Student._.Stu_ID == 2 的Stu_ID個數。 286 DbSession.Default.Count<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 287 288 //返回 Student._.Stu_ID == 2 的Stu_ID最大值。 289 DbSession.Default.Max<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 290 291 //返回 Student._.Stu_ID == 2 的Stu_ID最小值。 292 DbSession.Default.Min<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 293 294 } 295 296 297 /// <summary> 298 /// 添加事務處理 299 /// </summary> 300 public static void TestTrans() 301 { 302 303 DbTrans trans = DbSession.Default.BeginTransaction(); 304 try 305 { 306 DbSession.Default.Update<Student>(Student._.Stu_name, "apple", Student._.Stu_ID == 1, trans); 307 DbSession.Default.Update<Student>(Student._.Stu_name, "egg", Student._.Stu_ID == 2, trans); 308 trans.Commit(); 309 } 310 catch 311 { 312 trans.Rollback(); 313 } 314 finally 315 { 316 trans.Close(); 317 } 318 319 //存儲過程中的事務 (ProcName表示存儲過程名稱) 320 DbTrans trans1 = DbSession.Default.BeginTransaction(); 321 DbSession.Default.FromProc("ProcName").SetDbTransaction(trans); 322 323 } 324 325 326 /// <summary> 327 /// 批處理 328 /// </summary> 329 public static void batingTest() 330 { 331 //預設是10條sql執行一次。也可以自定義。 332 //DbBatch batch = DbSession.Default.BeginBatchConnection(20) 333 334 using (DbBatch batch = DbSession.Default.BeginBatchConnection()) 335 { 336 batch.Update<Student>(Student._.Stu_name, "apple", Student._.Stu_ID == 1); 337 batch.Update<Student>(Student._.Stu_name, "pear", Student._.Stu_ID == 2); 338 //執行batch.Execute(),就會將之前的sql腳本先提交。 339 //batch.Execute(); 340 batch.Update<Student>(Student._.Stu_name, "orange", Student._.Stu_ID == 3); 341 } 342 } 343 344 345 /// <summary> 346 /// 緩存 347 /// </summary> 348 public static void SetCacheTimeOutDemo() { 349 350 //SetCacheTimeOut設置查詢的緩存為180秒 351 DbSession.Default.From<Student>().Where(Student._.Stu_ID == 1).SetCacheTimeOut(180).ToFirst(); 352 353 354 355 } 356 357 358 359 } 360 }
工具生成的實體類如下:
//------------------------------------------------------------------------------ // <auto-generated> // 此代碼由工具生成。 // 運行時版本:2.0.50727.5485 // Support: http://www.cnblogs.com/huxj // 對此文件的更改可能會導致不正確的行為,並且如果 // 重新生成代碼,這些更改將會丟失。 // </auto-generated> //------------------------------------------------------------------------------ using System; using System.Data; using System.Data.Common; using Hxj.Data; using Hxj.Data.Common; namespace cn.School { /// <summary> /// 實體類Student 。(屬性說明自動提取資料庫欄位的描述信息) /// </summary> [Serializable] public class Student : Entity { public Student():base("Student") {} #region Model private int _Stu_ID; private string _Stu_name; private int? _stu_Age; private string _stu_Sex; private string _stu_phon; private int _gr_id; /// <summary> /// /// </summary> public int Stu_ID { get{ return _Stu_ID; } set { this.OnPropertyValueChange(_.Stu_ID,_Stu_ID,value); this._Stu_ID=value; } } /// <summary> /// /// </summary> public string Stu_name { get{ return _Stu_name; } set { this.OnPropertyValueChange(_.Stu_name,_Stu_name,value); this._Stu_name=value; } } /// <summary> /// /// </summary> public int? stu_Age { get{ return _stu_Age; } set { this.OnPropertyValueChange(_.stu_Age,_stu_Age,value); this._stu_Age=value; } } /// <summary> /// /// </summary> public string stu_Sex { get{ return _stu_Sex; } set { this.OnPropertyValueChange(_.stu_Sex,_stu_Sex,value); this._stu_Sex=value; } } /// <summary> /// /// </summary> public string stu_phon { get{ return _stu_phon; } set { this.OnPropertyValueChange(_.stu_phon,_stu_phon,value); this._stu_phon=value; } } /// <summary> /// /// </summary> public int gr_id { get{ return _gr_id; } set { this.OnPropertyValueChange(_.gr_id,_gr_id,value); this._gr_id=value; } } #endregion #region Method /// <summary> /// 獲取實體中的標識列 /// </summary> public override Field GetIdentityField() { return _.Stu_ID; } /// <summary> /// 獲取實體中的主鍵列 /// </summary> public override Field[] GetPrimaryKeyFields() { return new Field[] { _.Stu_ID}; } /// <summary> /// 獲取列信息 /// </summary> public override Field[] GetFields() { return new Field[] { _.Stu_ID, _.Stu_name, _.stu_Age, _.stu_Sex, _.stu_phon, _.gr_id}; } /// <summary> /// 獲取值信息 ///<