原文:AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享

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

本文,是AY 看github源码,和网上一些博客,文章 整理,写出来的。目前还没找到系统级别的教程

先建立.net framework4.6的控制台项目,添加nuget引用

新建了 Sqlserver的数据库TestDapper

SQL
CREATE TABLE [dbo].[Users](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](50) NULL,
[Email] [varchar](100) NULL,
[Address] [varchar](100) NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] CREATE TABLE [dbo].[Product](
[ProductID] [int] IDENTITY(1,1) NOT NULL,
[ProductName] [varchar](220) NULL,
[ProductDesc] [varchar](220) NULL,
[UserID] [int] NULL,
[CreateTime] [datetime] NULL,
CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

连接:

C#
      var con = new SqlConnection(ConfigurationManager.ConnectionStrings["sql"].ConnectionString);

新增后,返回新增ID-  MsSql:

C#
 var id = con.QueryFirst<int>("insert into users values('ay', 'ay2015@qq.com', '合肥市润安大厦');select  @@IDENTITY;");

新增后,返回新增ID-  MySql:

C#
var id = con.QueryFirst<int>("insert into users values(null, 'ay', 'ay2015@qq.com', '合肥市润安大厦');select last_insert_id();");

参数赋值,Query返回一个列表,这里Users这个Model是自己声明的:

C#
var u = con.Query<Users>("select * from Users where UserID = @UserID", new { UserID = 1 });
Console.WriteLine(u.First().UserName);

使用Execute执行 更删改sql,返回int,应该是受影响的行数

通过Execute执行update

C#
            con.Execute("update users set UserName = '李四川' where UserId = @UserId", new { UserId = 3 });
var u = con.Query<Users>("select * from Users where UserId = @UserId", new { UserId = 3});
Console.WriteLine(u.First().UserName);

删除

C#
  con.Execute("delete from users where UserId = @UserId", new { UserId = 3 });
var us = con.Query<Users>("select * from Users");
foreach (var item in us)
{
Console.WriteLine(item.UserName);
}

增加数据

C#
   var id = con.QueryFirst<int>("insert into users values('ay163', 'ay163@163.com', '合肥市润安大厦11');select  @@IDENTITY;");

IN操作的处理

C#
    var uss = con.Query<Users>("select * from Users where UserId in @UserIds", new { UserIds = new List<int> {1,2 } });
foreach (var item in uss)
{
Console.WriteLine(item.UserName);
}

插入一条数据

C#
 var id = con.Execute($"insert into Product values('WCF编程宝典', 'WCF基本入门的一本书籍', 1,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')");

多条sql查询反馈,我感觉这个设计真的好

C#
   //多条sql执行
var sql = "select * from Product; select * from Users";
using (var multiReader = con.QueryMultiple(sql))
{
var productList = multiReader.Read<Product>();
var userList = multiReader.Read<Users>();
foreach (var item in productList)
{
Console.WriteLine(item.ProductName);
} foreach (var item in userList)
{
Console.WriteLine(item.UserName);
}
}

关于多表查询的,假如1个表有个导航属性

Product加一个Users类型的User属性,使用 splitOn

C#
          var sql = @"select  p.ProductName,p.CreateTime,u.UserName
from Product as p
join Users as u
on p.UserID = u.UserID
where p.CreateTime > '2015-12-12'; "; var productList = con.Query<Product, Users, Product>(sql,
(product, users) =>
{
product.User = users; return product;
}, splitOn: "UserName");
foreach (var item in productList)
{
Console.WriteLine(item.ProductName+" "+item.User.UserName);
}

我把sql语句的createtime和u.username位置换了下

效果,日期没了,

如果位置换回来,又有了,说明是从右往左  分割复制的,只要列 不要是由2张表以上的列成员组成的就

如果你觉得很难理解,你可以新建一个类,把你的要返回的列,写成对应属性,效果一样的。

C#
  var sql = @"select  p.ProductName,p.CreateTime,u.UserName
from Product as p
join Users as u
on p.UserID = u.UserID
where p.CreateTime > '2015-12-12'; "; var productList = con.Query<TAY>(sql);
foreach (var item in productList)
{
Console.WriteLine(item.ProductName + " " + item.CreateTime + " " + item.UserName);
}
C#
  public class TAY
{
public string ProductName { get; set; }
public DateTime CreateTime { get; set; } public string UserName { get; set; }
}

执行存储过程,根据ID查询用户

SQL
USE TestDapper
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create proc [dbo].[sp_GetUsers]
@id int
as
begin
select * from Users where UserID = @id ;
end

代码简单,没的讲

C#
  var userList = con.Query<Users>("sp_GetUsers", new { id = 1 },
commandType: CommandType.StoredProcedure); foreach (var item in userList)
{
Console.WriteLine(item.UserName);
}

批量插入怎么写?

C#
  List<Users> user = new List<Users>();
for (int i = 1; i <= 1000; i++)
{
Users u = new Users();
u.UserName = "AY " + i;
u.Email = "EM " + i;
u.Address = "AD " + i;
user.Add(u);
}
con.Execute("insert users(UserName,Email,Address) values(@UserName,@Email,@Address)", user);
var userList = con.Query<Users>("select * from users");
foreach (var item in userList)
{
Console.WriteLine(item.UserName);
}

我个人觉得不太喜欢,查询如下

C#
  var userList = con.Query<Users>("select * from users where UserName like  '%测试%'");
foreach (var item in userList)
{
Console.WriteLine(item.UserName);
}
C#
  System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
StringBuilder sb = new StringBuilder("insert users(UserName,Email,Address) ");
for (int i = 1; i <= 1000; i++)
{
if (i == 1000)
sb.Append(string.Format("select '{0}','{1}','{2}' ", "用户" + i, "邮箱" + i, "地址" + i));
else
{
sb.Append(string.Format("select '{0}','{1}','{2}' UNION ", "用户" + i, "邮箱" + i, "地址" + i));
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());
sw.Start();
var _resultCount = con.Execute(sb.ToString());
Console.WriteLine(_resultCount);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());

当然肯定是不推荐以上两种,推荐SqlServer的BulkCopy

C#
    public bool SqlServerBulkInsert(DataTable table, string connectionString)
{
try
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlTransaction trans = conn.BeginTransaction(); SqlBulkCopy sqlbulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans);
// 设置源表名称
sqlbulkCopy.DestinationTableName = table.TableName;
//分几次拷贝
//sqlbulkCopy.BatchSize = 10;
// 设置超时限制
sqlbulkCopy.BulkCopyTimeout = CommandTimeOut;
foreach (DataColumn dtColumn in table.Columns)
{
sqlbulkCopy.ColumnMappings.Add(dtColumn.ColumnName, dtColumn.ColumnName);
}
try
{
// 写入
sqlbulkCopy.WriteToServer(table);
// 提交事务
trans.Commit();
return true;
}
catch(Exception ex)
{
trans.Rollback();
sqlbulkCopy.Close();
return false;
}
finally
{
conn.Close();
conn.Dispose();
sqlbulkCopy.Close();
}
}
}
catch (Exception e)
{ return false;
}
}

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

我先写这么多吧,下篇博客继续

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

AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享的更多相关文章

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

    原文:AY的Dapper研究学习-继续深入-C#开发-aaronyang技术分享 ====================www.ayjs.net       杨洋    wpfui.com      ...

  2. C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享

    原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享 曾经我做office,不想依赖别人dll,就使用了 Type.GetTypeFromProgID 可以根 ...

  3. AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

  4. C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享

    原文:C# 桌面软件开发-深入学习[2]- AY-C#人爱学不学-aaronyang技术分享 1 : C# Assembly.GetEntryAssembly().GetName().Version. ...

  5. AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

  6. 大数据学习路线:Hadoop集群同步技术分享

    今天给大家带来的技术分享是——Hadoop集群同步. 一.同步方式 选择一个机器,作为时间服务器(这里选择hadoop01),所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间. ...

  7. Docker的学习笔记(开发的技术分享转发)

    我的Docker学习记录一.安装dockeryum install -y docker-io二.使用docker1.下载镜像docker pull <image>2.查询镜像docker ...

  8. 通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门【华为云技术分享】

    久旱逢甘霖 西安连着几天温度排行全国三甲,也许是<哪吒之魔童降世>的剧组买通了老天,从踩着风火轮的小朋友首映开始,就全国性的持续高温,还好今天凌晨的一场暴雨,算是将大家从中暑边缘拯救回来了 ...

  9. Echarts快速入门---------v客学院技术分享

    ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等) ...

随机推荐

  1. 【C++竞赛 A】xxx的项链

    时间限制:2s 内存限制:64MB 问题描述 xxx有一个长度为n的宝石链,宝石有m种不同的颜色.xxx想截取其中连续的一段做一个项链.为了让项链更漂亮,xxx希望项链中的宝石包含所有颜色. 输入描述 ...

  2. php课程 5-18 数组排序和合并拆分函数有哪些

    php课程  5-18   数组排序和合并拆分函数有哪些 一.总结 一句话总结:分类来记.这些函数自己都可以写,费点时间而已. 1.array_combine()和array_merge()的区别是什 ...

  3. ArcEngine开发之Command控件使用篇

    转自原文 ArcEngine开发之Command控件使用篇 在ArcEngine类库中有大量的Command控件用来与地图控件进行操作和交互.比如有一系列的地图浏览控件.地图查询控件.图斑选取控件.编 ...

  4. 基于 Android NDK 的学习之旅-----资源释放

    做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概念(GC直接帮忙回收),后查询原因才知道是因为JNI 有些对 ...

  5. 高CPU、数据库无法读写

    高CPU.数据库无法读写的真凶   有兴趣的同学可以参考如下系列文章,都是针对dump分析的实战和总结: Windbg DUMP分析(原创汇总) http://www.cnblogs.com/Love ...

  6. cocos2d-x之道~制作第一款文字游戏(二)

    在 cocos2d-x之道~制作第一款文字游戏(一)中,使用cocos2d-x把主界面显示出来.分别有每一个级别提供的初始短语TileView,和目标短语TargetView.初步接触了cocos2d ...

  7. 【bzoj2453】维护队列 (分块 + 二分)

    传送门(权限题) 题目分析 题意为:求区间内有多少种不同的数,带修改. 首先对原序列分块,用last[i]表示与i相同的上一个在哪里,然后将分块后的数组每个块内的按照last进行排序,这样查询时就可以 ...

  8. MySQL分区表使用方法

    原文:MySQL分区表使用方法 1. 确认MySQL服务器是否支持分区表 命令: show plugins; 2. MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(H ...

  9. Spring Boot 定制与优化内置的Tomcat容器

    1.Spring Boot定制与优化内置Tomcat容器. > 内置的容器有三个分别是Undertow.Jetty.Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口 ...

  10. 卷积与反卷积、步长(stride)与重叠(overlap)

    1. 卷积与反卷积 如上图演示了卷积核反卷积的过程,定义输入矩阵为 I(4×4),卷积核为 K(3×3),输出矩阵为 O(2×2): 卷积的过程为:Conv(I,W)=O 反卷积的过称为:Deconv ...