AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
不想定义属性,直接索引方式用,Dynamic方式
var _1 = con.Query("SELECT * FROM USERS").ToArray(); Console.WriteLine(_1[0].UserName + " EMAIL: " + _1[0].Email);
带参数的存储过程
create proc _ay @address varchar(200) output, @id int as Select @address=[Address] from [Users] WHERE USERID=@id GO
数据库执行上面sql。
然后数据库中执行
DECLARE @address varchar(200) exec _ay @address output,@id=1 print '--------------------------------------------------' print @address
番外,带 参数的存储过程,其他TSQL存储过程参考
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
代码:
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);
这一块,一直报什么size错误,原来我存储过程设置output变量时候,设置了长度,所以要指定。
这里有4种类型呢。。returnValue我知道,inputoutput我就不清楚了。
关于参数这块呢,用法很多哎。。我们以前demo的 参数,都是匿名对象,或者类对象,现在可以像下面那样,有多个
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);
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);
以上东西,都是根据Dapper的源码下,Test项目,自己看,改出来的。
当然有的存储过程,返回的类型,种类很多,比如有的还是 数组,集合,地理信息 等,具体可以看dapper的源码下的Test学习。
还有个比较常用的sql,返回数量
var _q = con.Query<int>("select count(*) from Users Where UserName like '%ay%'").First(); Console.WriteLine(_q);
当列使用了AS,要不然泛型的话,加个你as的列名的属性,要不然就用dynamic方式
var _q = con.QueryFirstOrDefault("select UserName as UN from Users Where UserId=@id", new { id=1}); Console.WriteLine(_q.UN);
参数创建,还可以使用
1
dynamic expando = new ExpandoObject(); expando.A = 1; expando.B = "two"; var p = new DynamicParameters(); p.AddDynamicParams(expando);
2
var p = new DynamicParameters(); var list = new int[] { 1, 2, 3 }; var args = new Dictionary<string, object> { ["ids"] = list }; p.AddDynamicParams(args);
3
var p = new DynamicParameters(); var list = new int[] { 1, 2, 3 }; p.AddDynamicParams(new { list });
关于事物 这块
虽然,这里 第二行输出,貌似是改成功的
但是由于事务没提交,所以数据库不变的。我们回滚下,再查一下,是ay了。
现在提交事务,已经更改了。
发现事务执行完,sql的管理工具,可以继续执行了,不然sql执行,貌似被事务阻塞了。
修改下代码, Commit后的查询,不需要在加上 transaction:tran参数饿了。
感觉还有分页哦。。
打开SQLSERVER,执行 存储过程脚本
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
然后新建类
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的代码如下:
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条数据如下:
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
先写到这里了。不管了。
88 各位
推荐您阅读更多有关于“C#,”的文章
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Bypass 护卫神SQL注入防御(多姿势)
0x00 前言 护卫神一直专注服务器安全领域, 其中有一款产品,护卫神·入侵防护系统 ,提供了一些网站安全防护的功能,在IIS加固模块中有一个SQL防注入功能。 这边主要分享一下几种思路,Bypass 护卫神SQL注入防御。 0x01 环境搭建 护卫神官网:http://www.huweishen.com 软件版本:护卫神·入侵防护系统 V3.8.1 最新版本 下载地址:http://down.huweishen.com/hws.zip 测试环境:IIS+ASP/ASPX+MSSQL IIS+PHP+MySQL 0x02 WAF测试 护卫神SQL防注入的规则几年了基本都没有什么变化,先来一张拦截测试图: 姿势一:%00截断 %00截断是上传漏洞中常用的一个非常经典的姿势,在SQL注入中,也可以用来Bypass。 在WAF层,接收参数id后,遇到%00截断,只获取到 id=1,无法获取到后面的有害参数输入; 在ASPX+MSSQL中,支持%00来代替空白字符,构造的SQL语句得以成功执行,获取数据。 http://192.168.204.132/sql.aspx?id=1%00a...
- 下一篇
1. Python3源码—内建对象
1.1. Python内的对象 Python中的类和实例都是通过Python内的对象来实现的。Python中已经预先定义了一些类型对象。这些内建类型对象通过实例化,可以创建内建类型对象的实例对象。 在Python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且也不能在栈空间上生存。唯一的例外就是类型对象,Python中所有的内建的类型对象都是被静态初始化的。 在Python中,一个对象一旦被创建,它在内存中的大小就是不变的了。这就意味着那些需要容纳可变长度数据的对象只能在对象内维护一个指向一块可变大小的内存区域的指针。 1.2. PyObject PyObject是整个Python对象机制的核心,定义如下: // object.h typedef struct _object { _PyObje
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19