前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# SqlSugar框架的学习使用(六)-- 扩展用法

C# SqlSugar框架的学习使用(六)-- 扩展用法

作者头像
Vaccae
发布2019-08-23 16:22:58
6.4K0
发布2019-08-23 16:22:58
举报
文章被收录于专栏:微卡智享微卡智享

前言

上一篇《C# SqlSugar框架的学习使用(五)-- 更新和删除数据的详细用法》我们已经把SqlSugar的更新和删除的详细使用方法实现了,这篇将介绍一下SqlSugar的一些高级用法。

代码演示

分页查询

这里我只列举一下单表查询,我们在表tVipPayFlow表中随机插入了50000条数据,如下图

程序中加入分布查询

代码语言:javascript
复制
        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针对事务有三种用法

无数据返回只返回状态

代码语言:javascript
复制
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

返回数据并且返回状态

代码语言:javascript
复制
var result2 = db.Ado.UseTran<List<Student>>(() =>
{
    return db.Queryable<Student>().ToList();
});
// result.ErrorException
// result.IsSuccess
// result.Data

使用try catch来处理事务,用这种方式事务一定要加try catch回滚不然会锁表,在操作就卡死

代码语言:javascript
复制
try
{
 db.Ado.BeginTran();
 操作
 db.Ado.CommitTran();
}
catch (Exception ex)
{
 db.Ado.RollbackTran();
 throw ex;
}

出于习惯我还是习惯使用第三种,我只写第三种的DEMO程序了

代码语言:javascript
复制
        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只支持查询操作,并且支持拉姆达分页

代码语言:javascript
复制
        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>

代码语言:javascript
复制
        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脚本的方式,这种方式是不能直接用存储过程名字去调用的,需要这样写

代码语言:javascript
复制
db.Ado.GetInt("exec spName @p1",new {p=1})

CommandType.StoredProcedure 方式

代码语言:javascript
复制
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 来简化参数操作

代码语言:javascript
复制
string p=null;
 SugarParameter [] pars =db.Ado.GetParameters(new{p=1,p2=p});
 var p2= pars[1].Direction=ParameterDirection.Output;

批量打包SQL执行

批量打包执行

代码语言:javascript
复制
       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);
            }
        }

打包异步处理

代码语言:javascript
复制
        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);
            }
        }

批量打包查询

代码语言:javascript
复制
        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打包

代码语言:javascript
复制
       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);
            }
        }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档