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#教程。
