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

前言

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

代码演示

分页查询

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

format,png

程序中加入分布查询

format,png

        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);
            }
        }

format,png

事务处理

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);
            }
        }

执行第一次

format,png

执行第二次

format,png

执行SQL语句

Sqlqueryable

sqlueryable只支持查询操作,并且支持拉姆达分页

format,png

        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);
            }
        }

format,png

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);
            }
        }

format,png

执行存储过程

由于我们数据库没有存储过程,这里就不做测试了,列出调用方法

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执行

批量打包执行

format,png

       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);
            }
        }

format,png

打包异步处理

format,png

        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);
            }
        }

format,png

批量打包查询

format,png

        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);
            }
        }

format,png

手写SQL打包

format,png

       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);
            }
        }

format,png

-END-

Vaccae的往期经典


OpenCV

《C++ OpenCV案例实战---卡号获取

《C++ OpenCV案例实战---卡片截取(附代码)

《C++ OpenCV透视变换---切换手机正面图片》

《C++ OpenCV实战---获取数量

《C++ OpenCV实战---利用颜色分割获取数量》

《OpenCV4Android NDK方式进行Canny边缘检测》

《OpenCV4Android NDK方式TesserartOCR实时进行识别》

《OpenCV4Android NDK级联方式实时进行人脸检测》


Android

《Android利用SurfaceView结合科大讯飞修改语音实别UI

《Android关于语音识别的功能实现分析(一)---结构化思维》

《Android关于语音识别的功能实现分析(二)---语义解析》

《Android根据类生成签名字符串

《Android碎片化布局fragment的实战应用

《Android中RecyclerView嵌套RecyclerView

《Android里用AsyncTask后的接口回调


.Net C#

《C#自定义特性(Attribute)讲解与实际应用

《C#根据类生成签名字符串(附DEMO下载地址)

《C++创建动态库C#调用》

《C#与三菱PLC(型号FX2N)串口通讯类


数据库及其它

《Oracel存储过程写报表实战》

《Delphi轮播视频和图片程序(用于双屏显示程序)

《SQL随机增加销售数据的脚本编写(附脚本下载地址)

SQL Server中With As的介绍与应用(三)--递归的实战应用

《Oracle通过ODBC连接SQL Server数据库

Oracle利用row_number()over()方式解决插入数据时重复键的问题


长按下方二维码关注微卡智享

format,png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值