【转】https://www.cnblogs.com/lunawzh/p/6607116.html
访问量不大的项目我都是用EF写数据库操作,因为EF除了速度上慢以外,但开发效率极快,省略了很多sql写法,并能很方便的调用外键、集合等信息,用EF写项目最爽的事。不过有些项目网站要考虑运行速度,这时不得不用其它的ORM框架,我常用dapper,因为它效果快,而且写sql非常灵活,接下来面写一些方法看看dapper的使用
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表的对象集合,可一次把集合中的所有数据插入到数据表中。
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();
}
11、使用示例
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();
}
}
如果某一代码中多次操作数据库,可以把conn设置为打开,最后时再close,
conn.open()
conn.Query(.....
.....
for....
.....
conn.close()