AY的Dapper研究学习-基本入门-C#开发-aaronyang技术分享
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
本文,是AY 看github源码,和网上一些博客,文章 整理,写出来的。目前还没找到系统级别的教程
先建立.net framework4.6的控制台项目,添加nuget引用
新建了 Sqlserver的数据库TestDapper
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]
连接:
var con = new SqlConnection(ConfigurationManager.ConnectionStrings["sql"].ConnectionString);
新增后,返回新增ID- MsSql:
var id = con.QueryFirst<int>("insert into users values('ay', 'ay2015@qq.com', '合肥市润安大厦');select @@IDENTITY;");
新增后,返回新增ID- MySql:
var id = con.QueryFirst<int>("insert into users values(null, 'ay', 'ay2015@qq.com', '合肥市润安大厦');select last_insert_id();");
参数赋值,Query返回一个列表,这里Users这个Model是自己声明的:
var u = con.Query<Users>("select * from Users where UserID = @UserID", new { UserID = 1 });
Console.WriteLine(u.First().UserName);
使用Execute执行 更删改sql,返回int,应该是受影响的行数
通过Execute执行update
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);
删除
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);
}
增加数据
var id = con.QueryFirst<int>("insert into users values('ay163', 'ay163@163.com', '合肥市润安大厦11');select @@IDENTITY;");
IN操作的处理
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);
}
插入一条数据
var id = con.Execute($"insert into Product values('WCF编程宝典', 'WCF基本入门的一本书籍', 1,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')");
多条sql查询反馈,我感觉这个设计真的好
//多条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
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张表以上的列成员组成的就
如果你觉得很难理解,你可以新建一个类,把你的要返回的列,写成对应属性,效果一样的。
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);
}
public class TAY
{
public string ProductName { get; set; }
public DateTime CreateTime { get; set; }
public string UserName { get; set; }
}
执行存储过程,根据ID查询用户
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
代码简单,没的讲
var userList = con.Query<Users>("sp_GetUsers", new { id = 1 },
commandType: CommandType.StoredProcedure);
foreach (var item in userList)
{
Console.WriteLine(item.UserName);
}
批量插入怎么写?
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);
}
我个人觉得不太喜欢,查询如下
var userList = con.Query<Users>("select * from users where UserName like '%测试%'");
foreach (var item in userList)
{
Console.WriteLine(item.UserName);
}
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
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#,”的文章

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享
原文: AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Testing AY当前VS的版本---- 15.7.1 目前从15.3版本开始,就开始支持.net core的,网上很多资料都是旧的 创建空解决方案UtilityLibraries 添加一个 .NET Standard库 添加类StringLibrary C# using System; namespace UtilityLibraries { public static class StringLibrary { public static bool StartsWithUpper(this string s) { if (String.IsNullOrWhiteSpace(s)) return false; return Char.IsUpper(s[0]); } public static bool StartsWithLower(this string s) { if (Strin...
-
下一篇
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...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题