Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

简介:

Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下:

完整Demohttp://pan.baidu.com/s/1i3TcEzj

注 意 事 项:http://www.cnblogs.com/dunitian/p/5221058.html

平台之大势何人能挡? 带着你的Net飞奔吧!

http://www.cnblogs.com/dunitian/p/4822808.html#skill

扩展篇:http://www.cnblogs.com/dunitian/p/5710382.html

先安装一下Dapper(建议用nuget包来管理)

连接字符串:

string connStr = "Data Source=.;Initial Catalog=DapperDB;User ID=用户名;Password=密码";

强类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#region 强类型
             //public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)
             using  (SqlConnection conn =  new  SqlConnection(connStr))
             {
                 conn.Open();
 
                 //无参查询
                 //var qqModeList = conn.Query<QQModel>("select Id,Name,Count from QQModel");
                 //带参查询
                 var  qqModeList = conn.Query<QQModel>( "select Id,Name,Count from QQModel where Id in @id and Count>@count" new  { id =  new  int [] { 1, 2, 3, 4, 5, 6 }, count = 1 });
                 foreach  ( var  item  in  qqModeList)
                 {
                     Console.WriteLine(item.Id +  " "  + item.Name +  " "  + item.Count);
                 }
             }
             #endregion

动态类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
#region 动态类型
             ////逆天动态类型用的比较多[可能是MVC ViewBag用多了]
             //public static IEnumerable<dynamic> Query (this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)
             using  (SqlConnection conn =  new  SqlConnection(connStr))
             {
                 conn.Open();
                 var  qqModeList = conn.Query( "select Id,Name,Count from QQModel" ).ToList();
                 foreach  ( var  item  in  qqModeList)
                 {
                     Console.WriteLine(item.Id +  " "  + item.Name +  " "  + item.Count);
                 }
             }
             #endregion

多映射:

1
2
3
4
5
6
7
8
9
10
11
12
using  (SqlConnection conn =  new  SqlConnection(connStr))
{
     string  sqlStr =  @"select A.Id,A.Title,S.SeoKeywords from Article A
                     inner join SeoTKD S on A.SeoId=S.Id
                     where A.Id in @ids" ;
     conn.Open();
     var  articleList = conn.Query(sqlStr,  new  { ids =  new  int [] { 41, 42, 43, 44, 45, 46, 47, 48 } });
     foreach  ( var  item  in  articleList)
     {
         Console.WriteLine(item.Id +  " | "  + item.SeoKeywords +  " | :"  + item.Title);
     }
}

 多返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using  (SqlConnection conn =  new  SqlConnection(connStr))
{
     string  sqlStr =  @"select Id,Title,Author from Article where Id = @id
                       select * from QQModel where Name = @name
                       select * from SeoTKD where Status = @status" ;
     conn.Open();
     using  ( var  multi = conn.QueryMultiple(sqlStr,  new  { id = 11, name =  "打代码" , status = 99 }))
     {
         //multi.IsConsumed   reader的状态 ,true 是已经释放
         if  (!multi.IsConsumed)
         {
             //注意一个东西,Read获取的时候必须是按照上面返回表的顺序 (article,qqmodel,seotkd)
             //强类型
             var  articleList = multi.Read<Temp>(); //类不见得一定得和表名相同
             var  QQModelList = multi.Read<QQModel>();
             var  SeoTKDList = multi.Read<SeoTKD>();
 
             //动态类型
             //var articleList = multi.Read();
             //var QQModelList = multi.Read();
             //var SeoTKDList = multi.Read();
 
             #region 输出
             foreach  ( var  item  in  QQModelList)
             {
                 Console.WriteLine(item.Id +  " "  + item.Name +  " "  + item.Count);
             }
             foreach  ( var  item  in  SeoTKDList)
             {
                 Console.WriteLine(item.Id +  " | "  + item.SeoKeywords);
             }
             foreach  ( var  item  in  articleList)
             {
                 Console.WriteLine(item.Author);
             }
             #endregion
         }
 
     }
}

 增删改查:(删项目里面基本上不用)

1
2
3
4
5
6
7
8
9
10
11
12
13
using  (SqlConnection conn =  new  SqlConnection(connStr))
{
     conn.Open();
     //增
     int  count = conn.Execute( "insert into Article values(@title,@content,@author,961,1,2,2,N'2015-11-23 11:06:36.553',N'2015-11-23 11:06:36.553',N'5,103,113',91,N'3,5,11',0,N'/Images/article/16.jpg')" new  { title =  "Title1" , content =  "TContent1" , author =  "毒逆天"  });
 
     //改
     //int count = conn.Execute("update Article set Title=@title where Id=@id", new { title = "么么哒", id = 274 });
     if  (count > 0)
     {
         Console.WriteLine(count +  "条操作成功" );
     }
}

存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//查询
using  (SqlConnection conn =  new  SqlConnection(connStr))
{
     conn.Open();
     //参数名得和存储过程的变量名相同(参数可以跳跃传,键值对方式即可)
     //动态类型
     //var list = conn.Query("usp_test", new { aId = 11 }, commandType: CommandType.StoredProcedure);
     //强类型
     var  list = conn.Query<TitleAndKeyWords>( "usp_test" new  { aId = 11 }, commandType: CommandType.StoredProcedure);
     foreach  ( var  item  in  list)
     {
         Console.WriteLine(item.Id +  " | "  + item.SeoKeywords +  " | :"  + item.Title);
     }
}
 
//插入
using  (SqlConnection conn =  new  SqlConnection(connStr))
{
     conn.Open();
     int  count = conn.Execute( "usp_insertArticle" new  { title =  "Title11" , content =  "TContent1" , author =  "毒逆天"  }, commandType: CommandType.StoredProcedure);
     if  (count > 0)
     {
         Console.WriteLine(count +  "条操作成功" );
     }
}
 
//更新
using  (SqlConnection conn =  new  SqlConnection(connStr))
{
     conn.Open();
     int  count = conn.Execute( "usp_updateArticle" new  { id = 276, title =  "Dapper使用"  }, commandType: CommandType.StoredProcedure);
     if  (count > 0)
     {
         Console.WriteLine(count +  "条操作成功" );
     }
}

事物的使用:

先看看ADO.Net怎么用的

复制代码
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                string sql = @"insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 999999999999999999999999) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               ";
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    conn.Open();
                    cmd.Transaction = conn.BeginTransaction();
                    try
                    {
                        int i = cmd.ExecuteNonQuery();
cmd.Transaction.Commit(); Console.WriteLine(i); }
catch (Exception ex) { cmd.Transaction.Rollback(); Console.WriteLine(ex); } } }
复制代码

再看看Dapper的

复制代码
using (SqlConnection conn = new SqlConnection(connStr))
            {
                string sql = @"insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 9999999999999999999) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               insert into SeoTKD values(N'毒逆天,测试', N'测试测试测试', 1) 
                               ";
                conn.Open();
                var transaction = conn.BeginTransaction();
                try
                {
                    int i = conn.Execute(sql, transaction: transaction);
                    transaction.Commit();
                    Console.WriteLine(i);
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    Console.WriteLine(ex);
                }
            }
复制代码

 

 


本文转自毒逆天博客园博客,原文链接:http://www.cnblogs.com/dunitian/p/5226265.html,如需转载请自行联系原作者

相关文章
|
11月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
1128 7
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
12月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
SQL 存储 分布式数据库
分布式存储数据恢复—hbase和hive数据库数据恢复案例
分布式存储数据恢复环境: 16台某品牌R730xd服务器节点,每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障: 数据库底层文件被误删除,数据库不能使用。要求恢复hbase和hive数据库。
638 12
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
NoSQL MongoDB 数据库
数据库数据恢复——MongoDB数据库服务无法启动的数据恢复案例
MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 管理员在未关闭MongoDB服务的情况下拷贝数据库文件。将MongoDB数据库文件拷贝到其他分区后,对MongoDB数据库所在原分区进行了格式化操作。格式化完成后将数据库文件拷回原分区,并重新启动MongoDB服务。发现服务无法启动并报错。
|
存储 Oracle 关系型数据库
oracle数据恢复—oracle数据库执行错误truncate命令的数据恢复案例
oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致数据丢失的数据库数据恢复过程。