C#Dapper教程展示了如何使用Dapper在C#中对数据库进行编程。在本教程中,我们使用SQLServer。C#教程是C#语言的综合教程。
小巧玲珑
Dapper是适用于Microsoft.NET平台的简单对象映射器。它是一个将面向对象领域模型映射到传统关系数据库的框架。
Dapper的目标是代码简单性和性能。
Dapper没有特定于数据库的实现细节,它适用于所有.NETADO提供程序,包括SQLite、SQLCE、Firebird、Oracle、MySQL、PostgreSQL和SQLServer。Dapper由StackOverflow团队创建。
$ dotnet add package dapper
要使用Dapper,我们使用dotnet
工具将包引用添加到项目。
$ dotnet add package System.Data.SqlClient
我们还包括SQLServer的驱动程序。
CREATE TABLE cars(name, price) ( id INT identity(1,1) NOT NULL PRIMARY KEY, name VARCHAR(255) NOT NULL, price INT ) INSERT INTO cars(name, price) VALUES('Audi', 52642); INSERT INTO cars(name, price) VALUES('Mercedes', 57127); INSERT INTO cars(name, price) VALUES('Skoda', 9000); INSERT INTO cars(name, price) VALUES('Volvo', 29000); INSERT INTO cars(name, price) VALUES('Bentley', 350000); INSERT INTO cars(name, price) VALUES('Citroen', 21000); INSERT INTO cars(name, price) VALUES('Hummer', 41400); INSERT INTO cars(name, price) VALUES('Volkswagen', 21600);
在我们的例子中,我们使用这个表。
C#DapperExecuteScalar
ExecuteScalar
方法执行选择单个值的查询。
using System.Data.SqlClient; using Dapper; namespace ExecuteScalarEx { class Program { static void Main(string[] args) { var cs = @"Server=localhost\SQLEXPRESS;Database=testdb;Trusted_Connection=True;"; using var con = new SqlConnection(cs); con.Open(); var version = con.ExecuteScalar<string>("SELECT @@VERSION"); Console.WriteLine(version); } } }
该示例检索SQLServer数据库的版本。
var version = con.ExecuteScalar<string>("SELECT @@VERSION");
ExecuteScalar
方法执行SELECT@@VERSION
查询,它返回一个值:SQLServer的版本。
$ dotnet run Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Windows 10 Pro 10.0 <X6> (Build 18362: ) (Hypervisor)
C#Dapper查询
Query
方法执行查询并将其映射到动态对象列表。
using System.Data.SqlClient; using Dapper; namespace RetrieveAll { class Car { public int Id { get; set; } public string Name { get; set; } public int Price { get; set; } public override string ToString() { return $"{Id} {Name} {Price}"; } } class Program { static void Main(string[] args) { var cs = @"Server=localhost\SQLEXPRESS;Database=testdb;Trusted_Connection=True;"; using var con = new SqlConnection(cs); con.Open(); var cars = con.Query<Car>("SELECT * FROM cars").ToList(); cars.ForEach(car => Console.WriteLine(car)); } } }
该示例从cars
表中检索所有行。
var cars = con.Query<Car>("SELECT * FROM cars").ToList();
Query
方法执行SELECT*FROMcars
语句并返回对象列表。
cars.ForEach(car => Console.WriteLine(car));
我们遍历列表并将所有元素打印到控制台。
$ dotnet run 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600
C#Dapper执行
Execute
方法执行SQL查询
using System.Data.SqlClient; using Dapper; namespace UpdateRow { class Program { static void Main(string[] args) { var cs = @"Server=localhost\SQLEXPRESS;Database=testdb;Trusted_Connection=True;"; using var con = new SqlConnection(cs); con.Open(); int nOfRows = con.Execute("UPDATE dbo.[cars] SET [price] = 52000 WHERE [id] = 1"); Console.WriteLine("'UPDATE' affected rows: {0}", nOfRows); } } }
该示例更新单辆汽车的价格并返回受影响的行数。
int nOfRows = con.Execute("UPDATE dbo.[cars] SET [price] = 52000 WHERE [id] = 1");
UPDATE语句更新汽车的价格。Execute
方法返回更新的行数。
Console.WriteLine("'UPDATE' affected rows: {0}", nOfRows);
更新的行数打印到终端。
$ dotnet run 'UPDATE' affected rows: 1
C#Dapper参数化查询
参数化查询提高了安全性和性能。当我们编写参数化查询时,我们使用占位符而不是直接将值写入查询。
using System.Data.SqlClient; using Dapper; namespace Parameterized { class Car { public int Id { get; set; } public string Name { get; set; } public int Price { get; set; } public override string ToString() { return $"{Id} {Name} {Price}"; } } class Program { static void Main(string[] args) { var cs = @"Server=localhost\SQLEXPRESS;Database=testdb;Trusted_Connection=True;"; using var con = new SqlConnection(cs); con.Open(); var car = con.QueryFirst<Car>("SELECT * FROM cars WHERE id=@id", new { id = 3 }); Console.WriteLine(car); } } }
该示例从表中选择特定行。
var car = con.QueryFirst<Car>("SELECT * FROM cars WHERE id=@id", new { id = 3 });
QueryFirst
返回SQL查询的第一个结果。@id
是一个需要填充的占位符。第二个参数是填充占位符的参数。
$ dotnet run 3 Skoda 9000
C#Dapper删除行
以下示例从表中删除一行。
using System.Data.SqlClient; using Dapper; namespace DeleteRow { class Program { static void Main(string[] args) { var cs = @"Server=localhost\SQLEXPRESS;Database=testdb;Trusted_Connection=True;"; using var con = new SqlConnection(cs); con.Open(); int delRows = con.Execute(@"DELETE FROM [cars] WHERE Id = @Id", new { Id = 1 }); if (delRows > 0) { Console.WriteLine("car deleted"); } } } }
该示例使用Execute
方法删除一行。
C#Dapper动态参数
DynamicParameters
是一组可以传递给DapperQuery和Execute方法的参数。
using System.Data; using System.Data.SqlClient; using Dapper; namespace InsertRow { class Program { static void Main(string[] args) { var cs = @"Server=localhost\SQLEXPRESS;Database=testdb;Trusted_Connection=True;"; using var con = new SqlConnection(cs); con.Open(); var query = "INSERT INTO cars(name, price) VALUES(@name, @price)"; var dp = new DynamicParameters(); dp.Add("@name", "BMW", DbType.AnsiString, ParameterDirection.Input, 255); dp.Add("@price", 36600); int res = con.Execute(query, dp); if (res > 0) { Console.WriteLine("row inserted"); } } } }
该示例将一个新行插入到cars
表中。
var dp = new DynamicParameters(); dp.Add("@name", "BMW", DbType.AnsiString, ParameterDirection.Input, 255); dp.Add("@price", 36600);
我们动态提供参数值及其类型。
int res = con.Execute(query, dp);
动态参数作为Execute
方法的第二个参数传递。
在本文中,我们展示了如何使用Dapper工具在C#中对数据库进行编程。
列出所有C#教程。