Spiffy 4.0.1
dotnet add package Spiffy --version 4.0.1
NuGet\Install-Package Spiffy -Version 4.0.1
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用了 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Spiffy" Version="4.0.1" />
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用此包。
paket add Spiffy --version 4.0.1
NuGet 团队不提供对该客户端的支持。请联系其 维护者 以获取支持。
#r "nuget: Spiffy, 4.0.1"
#r 指令可用于 F# Interactive 和多语言笔记本。将其复制到交互式工具或脚本的源代码中以引用该包。
// Install Spiffy as a Cake Addin #addin nuget:?package=Spiffy&version=4.0.1 // Install Spiffy as a Cake Tool #tool nuget:?package=Spiffy&version=4.0.1
NuGet 团队不提供对该客户端的支持。请联系其 维护者 以获取支持。
Spiffy - .NET 简便的数据访问
Spiffy 是一个经过充分测试的库,旨在使 C# 从 C# 操作 ADO.NET 变得“多”简单。
该库提供了一种流畅的 API 来构建 IDbCommand
实例,以及支持执行的 IDbCommand
扩展方法。Spiffy 不是 ORM,鼓励您重新控制自己的映射。但是,Spiffy 通过扩展 IDataReader
接口,提供了几个助手来涵盖大多数原始类型,以使检索值更安全,更直接。
主要功能
目标设计
- 看起来“原生”,尽可能地增强基本 ADO.NET 功能,并遵循内部命名约定。
- 通过提供一种简洁安全的方法从表格数据中获取值来鼓励手动映射。
- 提供易于理解的执行模型。
- 支持异步数据库负载。
入门指南
安装 Spiffy NuGet 包
PM> Install-Package Spiffy
或使用 dotnet CLI
dotnet add package Spiffy
快速入门
using System;
using System.Data.Sqlite;
using Spiffy;
namespace SpiffyQuickStart
{
class Program
{
const connectionString = "{your connection string}";
static void Main(string[] args)
{
using var connection = new SqliteConnection(connectionString);
using var cmd = new DbCommandBuilder(connection)
.CommandText("SELECT author_id, full_name FROM author WHERE author_id = @author_id")
.DbParams(new DbParams("author_id", 1))
.Build();
cmd.Query(cmd, rd =>
Console.WriteLine("Hello {0}" rd.ReadString("full_name")));
}
}
}
使用 SQLite 的示例
对于此示例,假设我们有一个名为 connection
的 IDbConnection
using var connection = new SqliteConnection("Data Source=hello.db");
考虑以下领域模型
public class Author
{
public int AuthorId { get; set; }
public string FullName { get; set; }
public static Author FromDataReader (IDataReader rd)
{
return new Author() {
AuthorId = rd.ReadInt32("person_id"),
FullName = rd.ReadString("full_name")
}
}
}
查询多个强类型结果
using var cmd = new DbCommandBuilder(connection)
.CommandText("SELECT author_id, full_name FROM author")
.Build();
var authors = cmd.Query(Author.FromDataReader);
查询单个强类型结果
using var cmd = new DbCommandBuilder(connection)
.CommandText("SELECT author_id, full_name FROM author WHERE author_id = @author_id")
.DbParams(new DbParams("author_id", authorId))
.Build();
// This method is optimized to dispose the `IDataReader` after safely reading the first `IDataRecord
var author = cmd.QuerySingle(Author.FromDataReader);
多次执行一个语句
using var cmd = new DbCommandBuilder(connection)
.CommandText("INSERT INTO author (full_name) VALUES (@full_name)")
.Build();
var paramList = authors.Select(a => new DbParams("full_name", a.FullName));
cmd.ExecMany(paramList);
以事务方式执行一个语句
using var transaction = connection.TryBeginTransaction();
using var cmd = new DbCommandBuilder(tran)
.CommandText("UPDATE author SET full_name = @full_name where author_id = @author_id")
.DbParams(new DbParams() {
{ "author_id", author.AuthorId },
{ "full_name", author.FullName }
})
.Build();
cmd.Exec();
transaction.TryCommit();
异步执行一个标量命令(单个值)
using var cmd = new DbCommandBuilder(connection)
.CommandText("SELECT COUNT(*) AS author_count FROM author")
.Build();
var count = await cmd.QuerySingleAsync(rd => rd.ReadInt32("author_count"));
所有数据访问方法均有异步版本可用:
ExecAsync, ExecManyAsync, QueryAsync, QuerySingleAsync, ReadAsync
IDataReader
扩展方法
为了使从reader中获取值更加直观,有两组扩展方法可用
- 获取值,自动默认
- 以 Nullable<'a> 获取值
假设我们有一个名为 rd 的活动 IDataReader,并且我们目前正在读取一行,以下扩展方法可用于简化读取值
public static string ReadString(this IDataReader rd, string field);
public static char ReadChar(this IDataReader rd, string field);
public static bool ReadBoolean(this IDataReader rd, string field);
public static bool ReadBool(this IDataReader rd, string field);
public static byte ReadByte(this IDataReader rd, string field);
public static short ReadInt16(this IDataReader rd, string field);
public static short ReadShort(this IDataReader rd, string field);
public static int ReadInt32(this IDataReader rd, string field);
public static int ReadInt(this IDataReader rd, string field);
public static int ReadInt(this IDataReader rd, string field);
public static long ReadInt64(this IDataReader rd, string field);
public static long ReadLong(this IDataReader rd, string field);
public static decimal ReadDecimal(this IDataReader rd, string field);
public static double ReadDouble(this IDataReader rd, string field);
public static float ReadFloat(this IDataReader rd, string field);
public static Guid ReadGuid(this IDataReader rd, string field);
public static DateTime ReadDateTime(this IDataReader rd, string field);
public static bool? ReadNullableBoolean(this IDataReader rd, string field);
public static bool? ReadNullableBool(this IDataReader rd, string field);
public static byte? ReadNullableByte(this IDataReader rd, string field);
public static short? ReadNullableInt16(this IDataReader rd, string field);
public static short? ReadNullableShort(this IDataReader rd, string field);
public static int? ReadNullableInt32(this IDataReader rd, string field);
public static int? ReadNullableInt(this IDataReader rd, string field);
public static int? ReadNullableInt(this IDataReader rd, string field);
public static long? ReadNullableInt64(this IDataReader rd, string field);
public static long? ReadNullableLong(this IDataReader rd, string field);
public static decimal? ReadNullableDecimal(this IDataReader rd, string field);
public static double? ReadNullableDouble(this IDataReader rd, string field);
public static float? ReadNullableFloat(this IDataReader rd, string field);
public static Guid? ReadNullableGuid(this IDataReader rd, string field);
public static DateTime? ReadNullableDateTime(this IDataReader rd, string field);
异常
文档即将推出
为什么不自动映射?
不论如何(缓存与否),反射都很慢,且易碎,难以调试。因此,库鼓励您手动定义映射,并通过扩展 IDataReader
接口并提供辅助器以安全且直接地获取值来帮助您完成此操作。
为什么是“Spiffy”?
这是对 Dapper 的致敬,它在以 .NET 为目标的工作负载方面的方法上产生了革命性的影响。
发现一个错误?
有关错误,请参阅 问题。
许可证
由NHLPA Engineering在多伦多,安大略省的小心构建。许可证下 MIT。
产品 | 版本 -compatible 和其他计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 已计算。 |
.NET Framework | net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETStandard 2.0
- 无依赖。
NuGet 包
此包未被任何 NuGet 包使用。
GitHub 仓库
此包未被任何流行的 GitHub 仓库使用。