using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using System.Data;
using System.Data.SqlClient;
using Newtonsoft.Json;
namespace ConsoleApp2.test1
{
public class Class5
{
//原文:https://www.cnblogs.com/Sinte-Beuve/p/4231053.html
// https://github.com/StackExchange/Dapper
IDbConnection conn = new SqlConnection("data source=.\\sqlexpress;initial catalog=MyDbContext;user id=sa;password=sa;");
//Insert
public void test1()
{
string query = "INSERT INTO Book(Name)VALUES(@name)";
//对对象进行操作
Book book = new Book();
book.Name = "C";
conn.Execute(query, book);
//直接赋值操作
conn.Execute(query, new { name = "C#" });
}
//update
public void test2()
{
string query = "UPDATE Book SET Name=@name WHERE id =@id";
Book book = new Book();
book.Id = 1;
book.Name = "CC";
conn.Execute(query, book);
}
//delete
public void test3()
{
string query = "DELETE FROM Book WHERE id = @id";
Book book = new Book();
book.Id = 1;
conn.Execute(query, book);
int id = 2;
conn.Execute(query, new { id = id });
}
//无参数查询,返回列表,带参数查询和之前的参数赋值法相同。
public void test4()
{
string query = "SELECT * FROM Book";
var list = conn.Query<Book>(query).ToList();
Console.WriteLine(JsonConvert.SerializeObject(list));
}
//返回单条信息
public void test5()
{
string query = "SELECT * FROM Book WHERE id = @id";
int id = 4;
var book = conn.Query<Book>(query, new { id = id }).SingleOrDefault();
Console.WriteLine(JsonConvert.SerializeObject(book));
}
//查询:1--n
public void test6()
{
int id = 3;
//查询图书时,同时查找对应的书评,并存在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();
Console.WriteLine(JsonConvert.SerializeObject(b));
}
//查询:1--1
public void test7()
{
int id = 3;
BookReview br;
//string query = "SELECT * FROM BookReview WHERE id = @id";//demo上的查询有误
string query = "SELECT * FROM BookReview br LEFT JOIN Book b ON b.Id = br.BookId WHERE br.Id = @id";
br = conn.Query<BookReview, Book, BookReview>(query,
(bookReview, book) =>
{
bookReview.AssoicationWithBook = book;
return bookReview;
}, new { id = id }, splitOn: "Content").SingleOrDefault();//}, new { id = id }, splitOn: "Content").SingleOrDefault();
Console.WriteLine(JsonConvert.SerializeObject(br));
}
//事务
public void test8()
{
using (conn)
{
conn.Open();//demo又有问题,没有打开连接
IDbTransaction transaction = conn.BeginTransaction();//开始事务
try
{
int id = 3;
string query = "DELETE FROM Book WHERE id = @id";
string query2 = "DELETE FROM BookReview WHERE BookId = @BookId";
conn.Execute(query2, new { BookId = id }, transaction, null, null);//注意这里的删除顺序,先删子表,再删主表
conn.Execute(query, new { id = id }, transaction, null, null);
transaction.Commit();//提交事务
}
catch (Exception ex)
{
//出现异常,事务Rollback
transaction.Rollback();
throw new Exception(ex.Message);
}
}
}
}
//书
public class Book
{
public Book()
{
Reviews = new List<BookReview>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual List<BookReview> Reviews { get; set; }
public override string ToString()
{
return string.Format("[{0}]------《{1}》", Id, Name);
}
}
//书评
public class BookReview
{
public int Id { get; set; }
public int BookId { get; set; }
public virtual string Content { get; set; }
public virtual Book AssoicationWithBook { get; set; }
public override string ToString()
{
return string.Format("{0})--[{1}]\t\"{3}\"", Id, BookId, Content);
}
}
}