AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享

简介: 原文:AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。
原文: AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

不想定义属性,直接索引方式用,Dynamic方式

C#
   var _1 = con.Query("SELECT * FROM USERS").ToArray();
            Console.WriteLine(_1[0].UserName + "  EMAIL: " + _1[0].Email);

image.png


带参数的存储过程

SQL
create proc _ay
 @address varchar200) output,
 @id int
 as
 Select @address=[Address] from [Users] WHERE USERID=@id
 GO

数据库执行上面sql。

然后数据库中执行

SQL
DECLARE @address varchar(200) 
exec _ay @address output,@id=1
print '--------------------------------------------------'

  print @address

image.png

番外,带 参数的存储过程,其他TSQL存储过程参考

SQL
 if object_id('up_user') is not null
drop proc up_user
go
create proc up_user
as
set nocount on
delcare @age int
begin
select @age=uage from user
return @age
end
set nocount off
go
 
--执行该存储过程
declare @age int
exec @age=up_user
select @age

代码:

C#
  var p = new DynamicParameters();
            p.Add("@id", dbType: DbType.Int32, direction: ParameterDirection.Input,value:1);
            p.Add("@address", dbType: DbType.String, direction: ParameterDirection.Output,size:200);
            con.Execute("_ay", p, commandType: CommandType.StoredProcedure);
            string b = p.Get<string>("@address");
            Console.WriteLine(b);

image.png

这一块,一直报什么size错误,原来我存储过程设置output变量时候,设置了长度,所以要指定。

这里有4种类型呢。。returnValue我知道,inputoutput我就不清楚了。

image.png

关于参数这块呢,用法很多哎。。我们以前demo的 参数,都是匿名对象,或者类对象,现在可以像下面那样,有多个

C#
   var p2 = new DynamicParameters();
            p2.Add("id", 1, System.Data.DbType.String);
            var _q = con.QueryFirstOrDefault<Users>("select * from Users Where UserId=@id", p2);
            Console.WriteLine(_q.UserName);

image.png

C#
    var p3 = new DynamicParameters();
            p3.Add("cnt", System.Data.DbType.Int32,direction: ParameterDirection.Output);
            var _q = con.Query<Users>("select @cnt=count(*) from Users Where UserName like '%ay%'", p3);
            int cnt = p3.Get<int>("@cnt");
            Console.WriteLine(cnt);

image.png

以上东西,都是根据Dapper的源码下,Test项目,自己看,改出来的。

当然有的存储过程,返回的类型,种类很多,比如有的还是 数组,集合,地理信息 等,具体可以看dapper的源码下的Test学习。


还有个比较常用的sql,返回数量

C#
           var _q = con.Query<int>("select count(*) from Users Where UserName like '%ay%'").First();
            Console.WriteLine(_q);

image.png

当列使用了AS,要不然泛型的话,加个你as的列名的属性,要不然就用dynamic方式

C#
            var _q = con.QueryFirstOrDefault("select UserName as UN from Users Where UserId=@id", new { id=1});
            Console.WriteLine(_q.UN);


参数创建,还可以使用

1

C#
    dynamic expando = new ExpandoObject();
            expando.A = 1;
            expando.B = "two";

            var p = new DynamicParameters();
            p.AddDynamicParams(expando);

2

C#
var p = new DynamicParameters();
            var list = new int[] { 1, 2, 3 };
            var args = new Dictionary<string, object> { ["ids"] = list };
            p.AddDynamicParams(args);

3

C#
    var p = new DynamicParameters();
            var list = new int[] { 1, 2, 3 };
            p.AddDynamicParams(new { list });


关于事物 这块

image.png

虽然,这里 第二行输出,貌似是改成功的

但是由于事务没提交,所以数据库不变的。我们回滚下,再查一下,是ay了。

image.png

现在提交事务,已经更改了。

image.png

image.png

发现事务执行完,sql的管理工具,可以继续执行了,不然sql执行,貌似被事务阻塞了。

修改下代码, Commit后的查询,不需要在加上 transaction:tran参数饿了。

image.png




感觉还有分页哦。。


打开SQLSERVER,执行 存储过程脚本

SQL
Create PROCEDURE [dbo].[ProcGetPageData]
(  @TableName VARCHAR(1000), --表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
   @PrimaryKey NVARCHAR(100),    --主键,可以带表头 a.AID
   @Fields NVARCHAR(2000) = '*',--读取字段
   @Condition NVARCHAR(3000) = '',--Where条件
   @CurrentPage INT = 1,    --开始页码
   @PageSize INT = 10,        --页大小
   @Sort NVARCHAR(200) = '', --排序字段
   @RecordCount INT = 0 OUT
)
AS
DECLARE @strWhere VARCHAR(2000)
DECLARE @strsql NVARCHAR(3900)
IF @Condition IS NOT NULL AND len(ltrim(rtrim(@Condition)))>0
  BEGIN
   SET @strWhere = ' WHERE ' + @Condition + ' '
  END
ELSE
  BEGIN
   SET @strWhere = ''
  END
        
IF (charindex(ltrim(rtrim(@PrimaryKey)),@Sort)=0)
BEGIN
    IF(@Sort='')
        SET @Sort = @PrimaryKey + ' DESC '
    ELSE
        SET @Sort = @Sort+ ' , '+@PrimaryKey + ' DESC '
END
SET @strsql = 'SELECT @RecordCount = Count(1) FROM ' + @TableName + @strWhere  
EXECUTE sp_executesql @strsql ,N'@RecordCount INT output',@RecordCount OUTPUT
IF @CurrentPage = 1 --第一页提高性能
BEGIN 
  SET @strsql = 'SELECT TOP ' + str(@PageSize) +' '+@Fields
              + '  FROM ' + @TableName + ' ' + @strWhere + ' ORDER BY  '+ @Sort
END 
ELSE
  BEGIN
    /* Execute dynamic query */    
    DECLARE @START_ID NVARCHAR(50)
    DECLARE @END_ID NVARCHAR(50)
    SET @START_ID = CONVERT(NVARCHAR(50),(@CurrentPage - 1) * @PageSize + 1)
    SET @END_ID = CONVERT(NVARCHAR(50),@CurrentPage * @PageSize)
    SET @strsql =  ' SELECT *
   FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@Sort+') AS rownum, 
     '+@Fields+ '
      FROM '+@TableName + @strWhere +') AS XX
   WHERE rownum BETWEEN '+@START_ID+' AND ' +@END_ID +' ORDER BY XX.rownum ASC'
  END
EXEC(@strsql)
RETURN

然后新建类

C#
    public class PageInputParam
    {
        private string _TableName;
        //表名,多表是请使用 tA a inner join tB b On a.AID = b.AID
        public string TableName
        {
            get { return _TableName; }
            set { _TableName = value; }
        }
        private string _Fileds = "*";
        public string Fields
        {
            get { return _Fileds; }
            set { _Fileds = value; }
        }
        private string _PrimaryKey = "ID";
        public string PrimaryKey
        {
            get { return _PrimaryKey; }
            set { _PrimaryKey = value; }
        }
        private int _PageSize = 10;
        public int PageSize
        {
            get { return _PageSize; }
            set { _PageSize = value; }
        }
        private int _CurrentPage = 1;
        public int CurrentPage
        {
            get { return _CurrentPage; }
            set { _CurrentPage = value; }
        }
        private string _Sort = string.Empty;
        public string Sort
        {
            get { return _Sort; }
            set { _Sort = value; }
        }
        private string _Condition = string.Empty;
        public string Condition
        {
            get { return _Condition; }
            set { _Condition = value; }
        }
        private int _RecordCount;
        public int RecordCount
        {
            get { return _RecordCount; }
            set { _RecordCount = value; }
        }
    }
    public class AyPagingDto<T>
    {
        private int _Total;
        public AyPagingDto()
        {
            this._Data = new List<T>();
        }
        public int Total
        {
            get { return _Total; }
            set { _Total = value; }
        }
        private IList<T> _Data;
        public IList<T> Data
        {
            get { return _Data; }
            set { _Data = value; }
        }
        public int PageIndex { get; set; }
        public int PageSize { get; set; }
    }

    public static class AyDapperCommon
    {

        public static AyPagingDto<T> GetPageData<T>(this System.Data.SqlClient.SqlConnection conn, PageInputParam inputParam, object param = null)
        {
            var p = new DynamicParameters();
            string proName = "ProcGetPageData";
            p.Add("TableName", inputParam.TableName);
            p.Add("PrimaryKey", inputParam.PrimaryKey);
            p.Add("Fields", inputParam.Fields);
            p.Add("Condition", inputParam.Condition);
            p.Add("CurrentPage", inputParam.CurrentPage);
            p.Add("PageSize", inputParam.PageSize);
            p.Add("Sort", inputParam.Sort);
            p.Add("RecordCount", dbType: DbType.Int32, direction: ParameterDirection.Output);

            conn.Open();
            var pageData = new AyPagingDto<T>();
            pageData.Data = conn.Query<T>(proName, p, commandType: CommandType.StoredProcedure).ToList();
            conn.Close();
            pageData.Total = p.Get<int>("RecordCount");
            pageData.PageSize = Convert.ToInt32(Math.Ceiling(pageData.Total * 1.0 / inputParam.PageSize));
            pageData.PageIndex = inputParam.CurrentPage > pageData.PageSize ? pageData.PageSize : inputParam.CurrentPage;
            return pageData;
        }
    }

调用方法,AY的代码如下:

C#
 PageInputParam pip = new PageInputParam();
            pip.Condition = "1=1";
            pip.Condition += string.Format(" and UserName like '%{0}%'", "AY");

            pip.CurrentPage = 1;
            pip.Fields = "*";
            pip.Sort = "UserId asc";
            pip.PageSize = 20;
            pip.TableName = "Users";
            pip.PrimaryKey = "UserID";
            var userList = con.GetPageData<Users>(pip);
            foreach (var item in userList.Data)
            {
                Console.WriteLine(item.UserID + ":" + item.UserName);
            }

第一页,20条数据如下:

image.png


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

先写到这里了。不管了。


88 各位












推荐您阅读更多有关于“C#,”的文章

目录
相关文章
|
4月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
134 8
|
4月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
123 3
|
4月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
121 7
|
7月前
|
物联网 数据处理 C#
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据
C#实现上位机开发,串口通信,读写串口数据并处理16进制数据。在自动化、物联网以及工业控制行业中,上位机开发是一项重要的技能。本教程主要介绍使用C#进行上位机开发,重点在于串口通信和数据处理。
1397 82
|
10月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
398 0
|
5月前
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
185 0
|
10月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
324 51
|
9月前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
261 12
|
10月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
260 2
|
10月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
613 1