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                
#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                

Spiffy - .NET 简便的数据访问

NuGet Version build

Spiffy 是一个经过充分测试的库,旨在使 C# 从 C# 操作 ADO.NET 变得“多”简单。

该库提供了一种流畅的 API 来构建 IDbCommand 实例,以及支持执行的 IDbCommand 扩展方法。Spiffy 不是 ORM,鼓励您重新控制自己的映射。但是,Spiffy 通过扩展 IDataReader 接口,提供了几个助手来涵盖大多数原始类型,以使检索值更安全,更直接。

主要功能

  • 构建 IDbCommand 实例的流畅 API。
  • 简单的执行模型,通过 IDbCommand 扩展方法提供。
  • 通过 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 的示例

对于此示例,假设我们有一个名为 connectionIDbConnection

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 已计算。
兼容的目标框架
包含的目标框架(在包中)
有关 目标框架.NET Standard 的更多信息。
  • .NETStandard 2.0

    • 无依赖。

NuGet 包

此包未被任何 NuGet 包使用。

GitHub 仓库

此包未被任何流行的 GitHub 仓库使用。

版本 下载 最后更新
4.0.1 116 4/4/2024
4.0.0 93 4/4/2024
3.1.4 440 9/16/2022
3.1.3 372 9/13/2021
3.1.2 330 9/13/2021
3.1.1 361 3/9/2021
3.1.0 337 2/26/2021
3.0.0 335 12/15/2020
2.0.0 453 11/28/2020
1.1.0 355 11/27/2020
1.0.0 382 11/23/2020