参考地址:https://www.cnblogs.com/lunawzh/p/6607116.html

1、连接语句

var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlDiagnosticsDb"].ConnectionString);

使用dapper不需要考虑conn是否连接,在执行dapper时自行判断 open状态,如果没有打开它会自己打开。

2、insert

string query = "INSERT INTO Book(Name)VALUES(@name)";
conn.Execute(query, book);

book类中有name属性,就可以这样方便去写,当然也可以写成

string query = "INSERT INTO Book(Name)VALUES(@name)";
conn.Execute(query, new{@name=book.name});

3、update

string query = "UPDATE Book SET  Name=@name WHERE id =@id";
conn.Execute(query, book);

4、 delete

string query = "DELETE FROM Book WHERE id = @id";
conn.Execute(query, book);
conn.Execute(query, new { id = id });

5、query

string query = "SELECT * FROM Book";
//无参数查询,返回列表,带参数查询和之前的参数赋值法相同。
conn.Query<Book>(query).ToList(); //返回单条信息
string query = "SELECT * FROM Book WHERE id = @id";
book = conn.Query<Book>(query, new { id = id }).SingleOrDefault();

6、 传统sql in (1,2,3) 用dapper就这样写

conn.Query<Users>("SELECT * FROM Users s WHERE s.id IN (@ids) ",new { ids = new int[]{1,2,3}})

conn.Query<Users>("SELECT * FROM Users s WHERE s.id IN (@ids) ",new { ids = IDs.ToArray()})

在dapper因为安全性,不能直接用sql接接    要采用参数化,

7、批量插入

conn.Execute(@"insert MyTable(colA, colB) values (@a, @b)", new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } })

也可以直接写入一个集合

conn.Execute("insert user(name) values(@name)",users)

这里users是一个user表的对象集合,可一次把集合中的所有数据插入到数据表中。

8、多表查询

//查询图书时,同时查找对应的书评,并存在List中。实现1--n的查询操作
string query = "SELECT * FROM Book b LEFT JOIN BookReview br ON br.BookId = b.Id WHERE b.id = @id";
Book lookup = null;
//Query<TFirst, TSecond, TReturn>
var b = conn.Query<Book, BookReview, Book>(query,
  (book, bookReview) =>
  {
    //扫描第一条记录,判断非空和非重复
    if (lookup == null || lookup.Id != book.Id)
      lookup = book;
    //书对应的书评非空,加入当前书的书评List中,最后把重复的书去掉。
    if (bookReview != null)
      lookup.Reviews.Add(bookReview);
    return lookup;
  }, new { id = id }).Distinct().SingleOrDefault();
return b;

多表联合查询是比较麻烦一些,到现在不是完全明白,多看几个例子

var sql =  @"select * from Posts p join Users u on u.Id = p.OwnerId Order by p.Id";
var data = conn.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;},splitOn:"id");

Post类和User类,它们存在外键, conn.Query返回的类型是最后一个参数Post, 其中Post中有一属性Owner是User对象,在(post, user)=>lamda中指定了Owner值,上边的代码中的splitOn是ID,运行时,会从查询结果所有字段列表的最后一个字段开始进行匹配,一直到找到Id这个字段(大小写忽略),找到的第一个ID字段匹配User类的ID属性,那么从ID到最后一个字段都属于User,ID以前的字段都被影射到Post 通过 (post, user) => { return post;},把两个类的实例解析出来。

9、三表查询,一个是关联主键表(单个对象),一个是关联外键表(集合)。

    public partial class UserInfo
{
public UserInfo()
{
this.Persion = new HashSet<Persion>();
this.MyTYC = new HashSet<MyTYC>();
} public int id { get; set; }
public string name { get; set; }
public Nullable<System.DateTime> createTime { get; set; }
public Movies Movies { get; set; }
public virtual ICollection<MyTYC> MyTYC { get; set; }
}
    public class Movies
{
public int ID { get; set; }
public string Title { get; set; }
public string ReleaseDate { get; set; }
public string Genre { get; set; }
public string Price { get; set; }
public UserInfo UserInfo { get; set; } }
    public partial class MyTYC
{
public int id { get; set; }
public string name { get; set; } }
string sql = @"select * from UserInfo u
inner join [Movies].dbo.Movies m on u.id=m.ID
inner join MyTYC t on u.id=t.id";
var data = conn.Query<UserInfo, Movies, MyTYC, UserInfo>(sql, (u, m, t) => { u.Movies = m; u.MyTYC.Add(t); return u; });

注意这里的对象和集合的获取方法:u.Movies = m; u.MyTYC.Add(t);

10、多结果查询

var sql = @"select * from Customers where CustomerId = @id;
select * from Orders where CustomerId = @id;
select * from Returns where CustomerId = @id"; using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
var customer = multi.Read<Customer>().Single();
var orders = multi.Read<Order>().ToList();
var returns = multi.Read<Return>().ToList();
}

再来一个

class Program
{ //创建连接对象
protected static SqlConnection GetConnection()
{
var connection = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Integrated Security=True");
connection.Open();
return connection;
} static void Main(string[] args)
{
//测试输出多个结果集
var sql = @"INSERT INTO [dbo].[Student] ([Name]) VALUES ('A1'); select @@IDENTITY as A;
INSERT INTO [dbo].[Student] ([Name]) VALUES ('B1'); select @@IDENTITY as A;
INSERT INTO [dbo].[Student] ([Name]) VALUES ('C1'); select @@IDENTITY as A"; //初始化数据库连接
using (SqlConnection connection = GetConnection())
{
List<int> ilist = new List<int>();
//执行查询,获取结果集集合
var multi = connection.QueryMultiple(sql); //遍历结果集
while(!multi.IsConsumed)
{
//读取当前结果集
var result = multi.Read().ToList()[0].A;
if (result != null)
{
ilist.Add(Convert.ToInt32(result));
}
}
//for(int i = 0;i<3;i++)
//{
// var result = multi.Read().ToList()[0].A;
// if (result != null)
// {
// ilist.Add(Convert.ToInt32(result));
// }
//}
foreach (var item in ilist)
{
Console.WriteLine(item.ToString());
}
}
Console.ReadLine();
}
}

11、如果某一代码中多次操作数据库,可以把conn设置为打开,最后时再close,

比如:

conn.open()
conn.Query(.....
.....
for....
.....
conn.close()

最新文章

  1. OpenCASCADE Shape Location
  2. 批处理命令——call 和 start
  3. 利用JavaScript来实现省份—市县的二级联动
  4. poj2284 欧拉公式
  5. sharepoint SPFolder的使用
  6. url地址传参中文乱码处理
  7. 广告基本知识-ROI分解
  8. 简单说下Kanzi Studio
  9. java-bootstrap
  10. CF51C Three Base Stations
  11. Linux~常用的命令
  12. Linux主机之间ssh免密登录配置方法
  13. Python(三)——文件操作
  14. 通过java实现解压zip,rar的代码
  15. ftp权限设置大全!!!
  16. Python小笔记
  17. 你需要知道的 .NET
  18. python 术语
  19. php装curl拓展出错
  20. 【学习笔记】浅析Promise函数

热门文章

  1. Java-Maven-Runoob:Maven NetBeans
  2. 1060 Are They Equal
  3. PHP面向对象深入研究之【组合模式与装饰模式】
  4. C#简单操作XML
  5. windows服务器审核失败消息:事件ID: 861 进程标识符:904
  6. Linux学习笔记 -- Shell 变量
  7. linux lcd设备驱动剖析二
  8. MFC调试的几个技巧
  9. 利用jquery mobiscroll插件选择日期、select、treeList的具体运用
  10. NPOI-WebForm_Excel导入与导出