前言
上一篇《C# SqlSugar框架的学习使用(五)-- 更新和删除数据的详细用法》我们已经把SqlSugar的更新和删除的详细使用方法实现了,这篇将介绍一下SqlSugar的一些高级用法。
代码演示
分页查询
这里我只列举一下单表查询,我们在表tVipPayFlow表中随机插入了50000条数据,如下图
程序中加入分布查询
private void tsmnuquerypage_Click(object sender, EventArgs e)
{
//定义显示第几页
int pageidx = 1;
//定义每页获取多少行
int pagesize = 5;
//总行数,输出返回值
int totalsize = 0;
try
{
List<tVipPayFlow> flows = _db.Queryable<tVipPayFlow>()
.OrderBy(t => t.sa_date)
.OrderBy(p => p.sa_time)
.ToPageList(pageidx, pagesize, ref totalsize);
//输出显示
TextShow("总共有:" + totalsize + "条数据");
foreach (tVipPayFlow item in flows)
{
TextShow("销售日期:" + item.sa_date + " 时间:" + item.sa_time
+ " 销售额:" + item.Amount + " 流水号:" + item.SerialNo);
}
}
catch (Exception ex)
{
TextShow(ex.Message);
}
}
事务处理
SqlSugar针对事务有三种用法
无数据返回只返回状态
var result = db.Ado.UseTran(() =>
{
var beginCount = db.Queryable<Student>().Count();
db.Ado.ExecuteCommand("delete student");
//throw new Exception("error haha"); 测试代码
});
// result.ErrorException
// result.IsSuccess
返回数据并且返回状态
var result2 = db.Ado.UseTran<List<Student>>(() =>
{
return db.Queryable<Student>().ToList();
});
// result.ErrorException
// result.IsSuccess
// result.Data
使用try catch来处理事务,用这种方式事务一定要加try catch回滚不然会锁表,在操作就卡死
try
{
db.Ado.BeginTran();
操作
db.Ado.CommitTran();
}
catch (Exception ex)
{
db.Ado.RollbackTran();
throw ex;
}
出于习惯我还是习惯使用第三种,我只写第三种的DEMO程序了
private void tsmnuTrans_Click(object sender, EventArgs e)
{
try
{
POS pos = new POS();
pos.Posno = "0030";
pos.Posname = "30款台";
pos.OrgCode = "001";
pos.status = "1";
_db.Ado.BeginTran();
int count = _db.Insertable(pos).ExecuteCommand();
TextShow("插入了" + count + "条数据");
_db.Ado.CommitTran();
}
catch (Exception ex)
{
_db.Ado.RollbackTran();
TextShow(ex.Message);
}
}
执行第一次
执行第二次
执行SQL语句
Sqlqueryable
sqlueryable只支持查询操作,并且支持拉姆达分页
private void tsmnuquerysql_Click(object sender, EventArgs e)
{
try
{
int totalsize = 0;
List<tVipPayFlow> flows =
_db.SqlQueryable<tVipPayFlow>(
"select * from tVipPayFlow ")
.Where(t => t.sa_date == DateTime.Parse("2019-08-05"))
.ToPageList(1, 3, ref totalsize);
//输出显示
TextShow("总共有:" + totalsize + "条数据");
foreach (tVipPayFlow item in flows)
{
TextShow("销售日期:" + item.sa_date + " 时间:" + item.sa_time
+ " 销售额:" + item.Amount + " 流水号:" + item.SerialNo);
}
}
catch (Exception ex)
{
TextShow(ex.Message);
}
}
Ado方法
我们用到最多的还是查询返回List<T>,所以这里只列这个方法,当然还可以实现DataTabe,DataSet等
查询并返回List<T>
private void tsmnuquerysqlado_Click(object sender, EventArgs e)
{
//Ado方法不能使用ToPageList
string sql = "select * from tVipPayflow " +
"where sa_date=@sa_date";
try
{
List<tVipPayFlow> flows =
_db.Ado.SqlQuery<tVipPayFlow>(sql,
new List<SugarParameter>()
{
new SugarParameter("@sa_date",
DateTime.Parse("2019-08-06"))
});
//输出显示
foreach (tVipPayFlow item in flows)
{
TextShow("销售日期:" + item.sa_date + " 时间:" + item.sa_time
+ " 销售额:" + item.Amount + " 流水号:" + item.SerialNo);
}
}
catch (Exception ex)
{
TextShow(ex.Message);
}
}
执行存储过程
由于我们数据库没有存储过程,这里就不做测试了,列出调用方法
CommandType.Text方式
也就是SQL脚本的方式,这种方式是不能直接用存储过程名字去调用的,需要这样写
db.Ado.GetInt("exec spName @p1",new {p=1})
CommandType.StoredProcedure 方式
var dt2 = db.Ado.UseStoredProcedure().GetDataTable("sp_school",new{name="张三",age=0});// GetInt SqlQuery<T> 等等都可以用
//支持output
var nameP= new SugarParameter("@name", "张三");
var ageP= new SugarParameter("@age", null, true);//isOutput=true
var dt2 = db.Ado.UseStoredProcedure().GetDataTable("sp_school",nameP,ageP);
//ageP.value可以拿到返回值
Oracle游标
parameter.IsRefCursor =true;
我们还可以用 GetParameters 来简化参数操作
string p=null;
SugarParameter [] pars =db.Ado.GetParameters(new{p=1,p2=p});
var p2= pars[1].Direction=ParameterDirection.Output;
批量打包SQL执行
批量打包执行
private void tsmnuQueue_Click(object sender, EventArgs e)
{
try
{
_db.Insertable(new POS()
{
Posno = "0031", Posname = "31款台"
}).AddQueue();
_db.Insertable(new POS()
{
Posno = "0032",
Posname = "32款台"
}).AddQueue();
//将2条插入一起执行带有事务,
//如果外部有事务会走外部事务,外部没事务会走内部事务
int count=_db.SaveQueues();
TextShow("插入了" + count + "条数据");
}
catch (Exception ex)
{
TextShow(ex.Message);
}
}
打包异步处理
private async void tsmunQueueAsync_Click(object sender, EventArgs e)
{
try
{
_db.Insertable(new POS()
{
Posno = "0033",
Posname = "33款台"
}).AddQueue();
_db.Insertable(new POS()
{
Posno = "0034",
Posname = "34款台"
}).AddQueue();
int count = await _db.SaveQueuesAsync();
// ar.Wait();
TextShow("插入了" + count + "条数据");
}
catch (Exception ex)
{
TextShow(ex.Message);
}
}
批量打包查询
private void tsmnuqueueqry_Click(object sender, EventArgs e)
{
try
{
_db.Queryable<POS>().AddQueue();
_db.Queryable<POSTemp>().AddQueue();
var result = _db.SaveQueues<POS, POSTemp>();
for (int i = 0; i < 2; i++)
{
POS tmPos = result.Item1[i];
TextShow("POS:" + tmPos.Posno + " " + tmPos.Posname);
POSTemp lPosTemp = result.Item2[i];
TextShow("POSTemp:" + lPosTemp.Posno + " " + lPosTemp.Posname);
}
}
catch (Exception ex)
{
TextShow(ex.Message);
}
}
手写SQL打包
private void tsmnuquery_Click(object sender, EventArgs e)
{
try
{
_db.Queryable<POS>().AddQueue();
_db.AddQueue("select top 2 * from tVipPayFlow");
var result = _db.SaveQueues<POS, tVipPayFlow>();
for (int i = 0; i < 2; i++)
{
POS tmPos = result.Item1[i];
TextShow("POS:" + tmPos.Posno + " " + tmPos.Posname);
tVipPayFlow payFlow = result.Item2[i];
TextShow("tVipPayFlow:" + payFlow.SerialNo + " "
+ payFlow.sa_date + " " + payFlow.Vipno
+ " " + payFlow.Amount);
}
}
catch (Exception ex)
{
TextShow(ex.Message);
}
}
-END-
Vaccae的往期经典
OpenCV
《OpenCV4Android NDK方式进行Canny边缘检测》
《OpenCV4Android NDK方式TesserartOCR实时进行识别》
《OpenCV4Android NDK级联方式实时进行人脸检测》
Android
《Android利用SurfaceView结合科大讯飞修改语音实别UI》
《Android关于语音识别的功能实现分析(一)---结构化思维》
《Android关于语音识别的功能实现分析(二)---语义解析》
《Android中RecyclerView嵌套RecyclerView》
.Net C#
数据库及其它
《SQL Server中With As的介绍与应用(三)--递归的实战应用》
《Oracle利用row_number()over()方式解决插入数据时重复键的问题》
长按下方二维码关注微卡智享