当前位置: 首页 > 工具软件 > Dos.ORM > 使用案例 >

Dos.ORM学习

楚奇逸
2023-12-01

Dos.ORM学习

因为公司使用.net+dosORM开发,所以对常用的语句做个小结,一方面为了巩固,一方面不知道。

开始

一、查询操作

查询第一条数据并返回实体:

List products=DbSession.Default.From().Where(Products._.ID==2).ToList();

也可以返回其他类型 ToDateTable();ToDateSet();

查询,在于构造一个查询条件

FromSection,查询的字段,排序,分页都是FromSection 提供

dbsession.default.from<>().

.distinct()

.Top(5)

太复杂的报表使用手写sql或者存储过程实现‘

二、添加操作

Products p=new Products();

//开启修改 但是我一般不这样写修改

p.Attach();

//获取页面中输入的值

entityUtils.updateModel(p,“txt_”);

//返回值 插入操作

int returnValue=dbsession.default.insert§;

//查询

//什么是自增长字段

三、更新操作

Dictionary<field,object> dic=new Dictionary<Field,object>();

dic.Add(name,“apple”);

dic.Add(level,20);

int returnValue=Dbsession.default.update(dic,id==1);

//就是将需要修改的字段,值放到字典中,根据条件去更新。

四、删除

五、sql篇

关于如何直接执行sql语句

dbsession.default.fromsql(“select * from products”).toDateTable();

可以添加参数

DbSession.Default.FromSql(“select * from products where productid=pid”)

.AddInParameter(“pid”, DbType.Int32, 1)

.ToDataTable();

//这里看上去不太习惯 添加参数过程

  1. DbSession.Default.FromSql("select * from products where productid=pid or categoryid=cid")
  2. .AddInParameter("pid", DbType.Int32, 1)
  3. .AddInParameter("cid", DbType.Int32, 2)
  4. .ToDataTable();

addInParamter方法需要传进去三个参数

返回类型可以有很多种

六、存储过程

这一块,下午刚刚学习了mysql中的存储过程,看上去大体上相似。

首先创建存储过程

create procedure “sale by year”

@Beginning_Date DateTime,@Ending_Date DateTime AS

select A.shippedDate

from A inner join B on A.id=B.id

where A.shipDate between @Beginning_Date and @Ending_Date


执行带参数的存储过程

DbSession.Default.FromProc(“sale by year”)

​ .AddInParameter(“Beginning_Date”,DbType.DateTime,“1999-02-2”)

​ .AddInParameter()

​ .ToDataTable();

??什么是方法添加返回参数

AddReturnValueParameter


返回参数值

ProcSection proc=Dbsession.Default.FromProc(“testoutstore”)

.addoutParameter(“in1”,Int32,1);

proc.ExecuteNonQuery();//
Dictionary<string,object> returnValue=proc.GetReturnValues();
foreach(KeyValuePair<string ,object> kv in returnValue){
Response.Write(“ParameterName:”+kv.Key+“returnValue:”+Convert.ToString(kv.Value));
}

//扩展 关于executeNonQuery()
执行sql,返回一个整型变量,如果对数据库记录进行操作,返回操作受影响条数;如果是创建表,创建成功后返回-1.

七、其他介绍

1、sum方法

dbsession.default.sum<表>(条件);

2、avg

3、count

dbsession.default.count<表>(条件);

4、max

5、min

八、输出组件执行的sql

通过注册事件生成sql

dbsession.default.registerSqlLogger(database_OnLog);

private string sql;

void database_onLog(string logMsg){

​ sql+=logMsg;

}

通过执行以下,注销注册事件

dbsession.default.unregisterSqlLogger(datebase_onLog);

九、where条件

十、模糊查询

1/完全模糊

Products._.ProductName.Contain(“apple”)

2/左匹配

Products._.ProductName.BeginWith(“apple”)

3/in查询

Where(Products._.CategoryID.SelectIn(1,2,3))

4/not in 对应方法

是SelectNotIn

十一、子查询

一样

十二、联合查询

三表以上关联

from().

innerjoin(A.id==B.id)

.innerjoin(C.cid==B.cid)

.where(A._.country==“usa”)

.toDataTable();

下面 关于union和unionAll

union会区分结果排除相同的,union all直接合并结果集合。

十三、查询的排序、分组

分页中如果没有指定排序。组件会默认一个排序来实现分页。

当然也可以自己指定,如:

orderby(products._.categoryId.asc)

通过groupby设置按照哪些字段分组

这个看着有点奇怪

dbsession.default.from()

.groupby(A.id.groupby)

.select(A.name)

.todatatable();

十四、查询的字段

这个挺重要的,之前也听困扰我,做个小结。

给字段起别名,select productname as pname from products

在dos中,select(products._.productName.As(“pname”))

字段是一个field类 表示字段信息

field.count(); 记录数

field.trim() 去掉左右空格

field.left(int length) 从左边开始截取相应长度内容

field.substring(int startindex.int endindex) 截取相应范围内的字段内容

十五、事务

组件对于事务的封装做的不是很简洁,大体如下

using(DbTrans trans=DbSession.default.beginTransaction()){

​ dbsession.default.update(products..productName,“apple”,products..productID==1,trans);

​ trans.commit();

}

下面是他的try_catch写法

  1. DbTrans trans = DbSession.Default.BeginTransaction();
  2. try
  3. {
  4. DbSession.Default.Update<Products>(Products._.ProductName, "apple", Products._.ProductID == 1, trans);
  5. DbSession.Default.Update<Products>(Products._.ProductName, "egg", Products._.ProductID == 2, trans);
  6. trans.Commit();
  7. }
  8. catch
  9. {
  10. trans.Rollback();
  11. }
  12. finally
  13. {
  14. trans.Close();
  15. }

可以看到,添加了一个回滚和一个关闭数据库的操作;

另外,存储过程和直接执行sql也是可以添加事务。

也可以设置事务级别,如下

DbTrans trans=dbsession.default.beginTransaction(isolationLevel.readCommitted);

关于事务的更新内容:

改成这样:

{

​ trans.Update(Products._.ProductName,“apple”);

​ trans.commit();

}

看上去简洁了,忘掉前面的做法

十六、批处理

用的不多

提交的脚本不是马上执行,而是到一定数量才提交

using (DbBatch batch=dbsession.default.beginBatchConnection()){

​ batch.update(Products._.ProductName,“apple”);

​ 等多条

}

默认是10条执行一次,也可自定义

dbBatch batch=dbsession.default.beginBatchConnection(20)

十七、分页

有封装好的方法,这里就不写了。

十八、toscalar

组件自动转换类型

dbsession.default.from().select(products._.productID).top(1).toscalar();

十九、缓存

开启缓存

enable=“true”

表示缓存60秒

缓存的存在,减少了连接数据库的次数,提高效率。

二十、自定义缓存

1、刷新缓存,不从缓存中读取,直接从数据库读,然后重新缓存。

dbsession.default.from().where(Products._.ProductID==1).Refresh().ToFirst();

2、设置查询的缓存有效期

dbsession.default.from().where(products._.productID==1).setCacheTimeOut(180).ToFirst();

二十一、Sqlite数据库

1、配置数据库连接

2、

Dbsession session=new Hxj.Data.Dbsession( “sqliteconnectionString”);

using(Hxj.data.DbBatch batch=session.BeginBatchConnection()){

​ for(int i=0;i<100;i++){

​ test t=new test();

​ batch.Insert(t);

}

}

批量添加100条数据。

二十二、主键自增长

没有看懂

二十三、字段组合更新

有点累了 不想写了

二十四、DbSession的推荐写法

新领域

操作数据的入口,之前一直用的都是dbsession.default

推荐在实际项目中创建dbsession

什么是log4net

二十五、WhereClipBuilder

之前版本中,每增加一个条件都是生成一个新的whereClip,实际上会引起资源浪费

现在使用:

WhereClipBuilder wherebuilder=new WhereClipBuilder();

whereclipbuilder.And(kkkkk);

whereclipbuilder.Or(dsffd);

好了,常用的工具小结就先告一段落。

 类似资料: