AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享
原文: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#,”的文章
AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享的更多相关文章
- AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享
原文:AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享 ====================www.ayjs.net 杨洋 wpfui.com ...
- C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享 曾经我做office,不想依赖别人dll,就使用了 Type.GetTypeFromProgID 可以根 ...
- C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...
- AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享
原文:AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...
- AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享
原文:AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...
- 大数据学习路线:Hadoop集群同步技术分享
今天给大家带来的技术分享是——Hadoop集群同步. 一.同步方式 选择一个机器,作为时间服务器(这里选择hadoop01),所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间. ...
- Docker的学习笔记(开发的技术分享转发)
我的Docker学习记录一.安装dockeryum install -y docker-io二.使用docker1.下载镜像docker pull <image>2.查询镜像docker ...
- Dapper快速学习
Dapper快速学习 我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dap ...
- 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
原文 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...
随机推荐
- HOOK API入门之Hook自己程序的MessageBoxW(简单入门)
说到HOOK,我看了很多的资料和教程,无奈就是学不会HOOK,不懂是我的理解能力差,还是你们说的 不够明白,直到我看了以下这篇文章,终于学会了HOOK: http://blog.sina.com.cn ...
- Django日志器的使用
Logging Mudel A quick logging primer Django uses Python’s builtin logging module to perform system l ...
- 【76.83%】【codeforces 554A】Kyoya and Photobooks
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- arcengine 开发经典帖 【强烈推荐仔细研读】
转自原文 arcengine 开发经典帖 使用ArcGIS Engine 开发自定义GIS应用: 第一部分:使用ArcGIS Engine 发布自定义GIS应用软件-全面了解ArcGIS Engine ...
- Qt 打开安卓相冊选择图片并获取图片的本地路径
Qt 打开安卓相冊选择图片并获取图片的本地路径 过程例如以下: 通过 Intent 打开安卓的系统相冊. 推荐使用 QAndroidJniObject::getStaticObjectField 获取 ...
- 小强的HTML5移动开发之路(23)—— jQuery Mobile入门
一.下载jQuery Mobile 下载地址:http://jquerymobile.com/ 点击Download 下载如下zip包 下载成功后如下图 解压目录如图: 点击index.html进入d ...
- Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题
原文:Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题 Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位 ...
- Redis中的管道(PipeLine)与事物(Transactions)
Redis中的管道(PipeLine)与事物(Transactions) 序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次 ...
- Java--基础命名空间和相关东西(JAVA工程师必须会,不然杀了祭天)
java.lang (提供利用 Java 编程语言进行程序设计的基础类)java.lang.annotation(提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互)java.lang.inst ...
- 第一次react-native项目实践要点总结 good
今天完成了我的第一个react-native项目的封包,当然其间各种环境各种坑,同时,成就感也是满满的.这里总结一下使用react-native的一些入门级重要点(不涉及环境).注意:阅读需要语法基础 ...