{"id":51056942,"url":"https://github.com/delly-net/dbunny","last_synced_at":"2026-06-22T22:00:58.735Z","repository":{"id":359176976,"uuid":"1240421543","full_name":"delly-net/DBunny","owner":"delly-net","description":"A lightweight .NET database abstraction layer that provides a unified API for working with multiple database types. DBunny uses a provider pattern to enable database-specific implementations while maintaining a common interface.","archived":false,"fork":false,"pushed_at":"2026-05-27T17:02:15.000Z","size":2239,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-21T20:07:36.306Z","etag":null,"topics":["csharp","data-access","database","database-abstraction","dotnet","dotnet-standard","provider-pattern","sqlite"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/delly-net.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-16T05:40:15.000Z","updated_at":"2026-05-27T17:02:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/delly-net/DBunny","commit_stats":null,"previous_names":["delly-net/dbunny"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/delly-net/DBunny","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delly-net%2FDBunny","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delly-net%2FDBunny/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delly-net%2FDBunny/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delly-net%2FDBunny/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/delly-net","download_url":"https://codeload.github.com/delly-net/DBunny/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delly-net%2FDBunny/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34666963,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","data-access","database","database-abstraction","dotnet","dotnet-standard","provider-pattern","sqlite"],"created_at":"2026-06-22T22:00:55.373Z","updated_at":"2026-06-22T22:00:58.729Z","avatar_url":"https://github.com/delly-net.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DBunny\n\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![.NET](https://img.shields.io/badge/.NET-Standard2.0%20%7C%20net5.0%20%7C%20net8.0-purple.svg)](https://dotnet.microsoft.com/)\n[![AOT Compatible](https://img.shields.io/badge/AOT-Compatible-success.svg)](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/)\n\nA lightweight .NET database abstraction layer that provides a unified API for working with multiple database types. DBunny uses a provider pattern to enable database-specific implementations while maintaining a common interface.\n\n## Features\n\n- **Multi-Database Support**: Write database-agnostic code, switch providers as needed\n- **Lightweight**: Minimal overhead with a clean, simple API\n- **Provider Pattern**: Easy to extend with new database providers\n- **Async Support**: Full async/await support for database operations\n- **Multi-Target**: Supports .NET Standard 2.0, .NET 5.0, and .NET 8.0\n- **AOT Compatible**: Ready for Native AOT compilation on .NET 8.0\n- **Null Reference Types**: Enabled for .NET 5.0 and later\n\n## Packages\n\n| Package | Description | Platform | NuGet |\n|---------|-------------|----------|-------|\n| [Delly.DBunny.Core](Delly.DBunny.Core/) | Core library with interfaces and base types | Cross-platform | - |\n| [Delly.DBunny.Sqlite](Delly.DBunny.Sqlite/) | SQLite provider implementation | Cross-platform | - |\n| [Delly.DBunny.MySql](Delly.DBunny.MySql/) | MySQL provider implementation | Cross-platform | - |\n| [Delly.DBunny.PostgreSql](Delly.DBunny.PostgreSql/) | PostgreSQL provider implementation | Cross-platform | - |\n| [Delly.DBunny.Oracle](Delly.DBunny.Oracle/) | Oracle provider implementation | Cross-platform | - |\n| [Delly.DBunny.SqlServer](Delly.DBunny.SqlServer/) | SQL Server provider implementation | Cross-platform | - |\n| [Delly.DBunny.MsAccess](Delly.DBunny.MsAccess/) | Microsoft Access provider (.accdb \u0026 .mdb) | Windows only | - |\n\n## Installation\n\n### Core Package\n\n```bash\ndotnet add package Delly.DBunny.Core\n```\n\n### SQLite Provider\n\n```bash\ndotnet add package Delly.DBunny.Sqlite\n```\n\n### MySQL Provider\n\n```bash\ndotnet add package Delly.DBunny.MySql\n```\n\n### PostgreSQL Provider\n\n```bash\ndotnet add package Delly.DBunny.PostgreSql\n```\n\n### Oracle Provider\n\n```bash\ndotnet add package Delly.DBunny.Oracle\n```\n\n### SQL Server Provider\n\n```bash\ndotnet add package Delly.DBunny.SqlServer\n```\n\n### Microsoft Access Provider\n\n\u003e **Windows Only:** The Access provider is only supported on Windows.\n\n```bash\ndotnet add package Delly.DBunny.MsAccess\n```\n\n## Quick Start\n\n### SQLite Example\n\n```csharp\nusing Delly.DBunny;\nusing Delly.DBunny.Sqlite;\nusing Delly.DBunny.Sql.Extension;\nusing System.Data.Common;\n\n// Create SQLite provider directly\nvar provider = new SqliteProvider();\nvar connectionString = \"Data Source=mydb.db;Pooling=False\";\n\nusing var connection = provider.GetDbConnection(connectionString);\nconnection.Open();\n\n// Create a table\nvar columnDescriptors = new List\u003cDbColumnDesciptor\u003e\n{\n    new DbColumnDesciptor { ColumnName = \"Id\", ColumnType = \"INTEGER\", PrimaryKeyFlag = true, NullableFlag = false },\n    new DbColumnDesciptor { ColumnName = \"Name\", ColumnType = \"TEXT(100)\", PrimaryKeyFlag = false, NullableFlag = false },\n    new DbColumnDesciptor { ColumnName = \"Age\", ColumnType = \"INTEGER\", PrimaryKeyFlag = false, NullableFlag = true }\n};\nvar tableDesciptor = new DbTableDesciptor { TableName = \"Users\" };\nvar createTableSql = provider.SqlProvider.CreateTable(tableDesciptor, columnDescriptors);\n\nusing var createCommand = provider.GetDbCommand(connection);\ncreateCommand.CommandText = createTableSql.Sql;\nawait createCommand.ExecuteNonQueryAsync();\n\n// Execute a query\nvar sql = new Sqled(\"SELECT * FROM Users WHERE Age \u003e @minAge\")\n    .Set(\"minAge\", 18);\n\nusing var command = provider.GetDbCommand(connection);\ncommand.CommandText = sql.Sql;\nprovider.SetParameters(command, sql.Parameters);\n\n// Read data\nawait provider.ReadAsync(connection, sql, async reader =\u003e\n{\n    while (await reader.ReadAsync())\n    {\n        var id = reader[\"Id\"];\n        var name = reader[\"Name\"];\n        Console.WriteLine($\"Id: {id}, Name: {name}\");\n    }\n});\n```\n\n### SQL Server Example\n\n```csharp\nusing Delly.DBunny;\nusing Delly.DBunny.SqlServer;\nusing Delly.DBunny.Sql.Extension;\nusing Delly.DBunny.Connecting.Extension;\nusing System.Data.Common;\n\n// Define connection using builder\nvar connectionDefine = new SqlServerConnectionDefine()\n    .WithServer(\"localhost\")\n    .WithDatabase(\"mydb\")\n    .WithUserId(\"sa\")\n    .WithPassword(\"your_password\")\n    .WithTrustServerCertificate(true);\n\nvar connectionDescriptor = connectionDefine.GetDbConnectionDescriptor(\n    SqlServerConnectionDefine.DATABASE_TYPE, \"Default\");\n\nvar provider = new SqlServerProvider();\nusing var connection = provider.GetDbConnection(connectionDescriptor.ConnectionString);\nconnection.Open();\n\n// Create a table in dbo schema\nvar columnDescriptors = new List\u003cDbColumnDesciptor\u003e\n{\n    new DbColumnDesciptor { ColumnName = \"Id\", ColumnType = \"INT\", PrimaryKeyFlag = true, NullableFlag = false },\n    new DbColumnDesciptor { ColumnName = \"Name\", ColumnType = \"NVARCHAR(100)\", PrimaryKeyFlag = false, NullableFlag = false },\n    new DbColumnDesciptor { ColumnName = \"Age\", ColumnType = \"INT\", PrimaryKeyFlag = false, NullableFlag = true }\n};\nvar tableDesciptor = new DbTableDesciptor { SchemaName = \"dbo\", TableName = \"Users\" };\nvar createTableSql = provider.SqlProvider.CreateTable(tableDesciptor, columnDescriptors);\n\nusing var createCommand = provider.GetDbCommand(connection);\ncreateCommand.CommandText = createTableSql.Sql;\nawait createCommand.ExecuteNonQueryAsync();\n\n// ... same query operations as SQLite\n```\n\n### MySQL Example\n\n```csharp\nusing Delly.DBunny;\nusing Delly.DBunny.MySql;\nusing Delly.DBunny.Sql.Extension;\nusing Delly.DBunny.Connecting.Extension;\nusing System.Data.Common;\n\nvar connectionDefine = new MySqlConnectionDefine()\n    .WithServer(\"localhost\")\n    .WithPort(3306)\n    .WithDatabase(\"mydb\")\n    .WithUserId(\"root\")\n    .WithPassword(\"password\")\n    .WithCharset(\"utf8mb4\");\n\nvar connectionDescriptor = connectionDefine.GetDbConnectionDescriptor(\n    MySqlConnectionDefine.DATABASE_TYPE, \"Default\");\n\nvar provider = new MySqlProvider();\nusing var connection = provider.GetDbConnection(connectionDescriptor.ConnectionString);\nconnection.Open();\n\n// ... same query operations as SQLite (uses backticks for name quoting)\n```\n\n### PostgreSQL Example\n\n```csharp\nusing Delly.DBunny;\nusing Delly.DBunny.PostgreSql;\nusing Delly.DBunny.Sql.Extension;\nusing Delly.DBunny.Connecting.Extension;\nusing System.Data.Common;\n\nvar connectionDefine = new PostgreSqlConnectionDefine()\n    .WithHost(\"localhost\")\n    .WithPort(5432)\n    .WithDatabase(\"mydb\")\n    .WithUsername(\"postgres\")\n    .WithPassword(\"password\");\n\nvar connectionDescriptor = connectionDefine.GetDbConnectionDescriptor(\n    PostgreSqlConnectionDefine.DATABASE_TYPE, \"Default\");\n\nvar provider = new PostgreSqlProvider();\nusing var connection = provider.GetDbConnection(connectionDescriptor.ConnectionString);\nconnection.Open();\n\n// ... same query operations as SQLite (uses double quotes for name quoting)\n```\n\n### Oracle Example\n\n```csharp\nusing Delly.DBunny;\nusing Delly.DBunny.Oracle;\nusing Delly.DBunny.Sql.Extension;\nusing Delly.DBunny.Connecting.Extension;\nusing System.Data.Common;\n\nvar connectionDefine = new OracleConnectionDefine()\n    .WithDataSource(\"localhost:1521/ORCL\")\n    .WithUserId(\"system\")\n    .WithPassword(\"password\");\n\nvar connectionDescriptor = connectionDefine.GetDbConnectionDescriptor(\n    OracleConnectionDefine.DATABASE_TYPE, \"Default\");\n\nvar provider = new OracleProvider();\nusing var connection = provider.GetDbConnection(connectionDescriptor.ConnectionString);\nconnection.Open();\n\n// ... same query operations as SQLite (note: Oracle uses : parameter prefix)\n```\n\n### Microsoft Access Example\n\n\u003e **Note:** The Access provider is Windows-only as it depends on Microsoft Access Database Engine (OLE DB).\n\n```csharp\nusing Delly.DBunny;\nusing Delly.DBunny.MsAccess;\nusing Delly.DBunny.Sql.Extension;\nusing Delly.DBunny.Connecting.Extension;\nusing System.Data.Common;\n\n// For modern .accdb files\nvar connectionDefine = new MsAccessConnectionDefine()\n    .WithDataSource(\"mydb.accdb\")\n    .WithProviderAce()\n    .WithPooling(false)\n    .WithReadWrite();\n\n// For legacy .mdb files (32-bit only)\nvar legacyConnectionDefine = new MsAccessConnectionDefine()\n    .WithDataSource(\"mydb.mdb\")\n    .WithProviderJet()\n    .WithPooling(false);\n\nvar connectionDescriptor = connectionDefine.GetDbConnectionDescriptor(\n    MsAccessConnectionDefine.DATABASE_TYPE, \"Default\");\n\nvar provider = new MsAccessProvider();\nusing var connection = provider.GetDbConnection(connectionDescriptor.ConnectionString);\nconnection.Open();\n\n// Note: Access uses position-based parameters (?)\nvar insertSql = new Sqled(\"INSERT INTO [Users] (Name, Age) VALUES (?, ?)\")\n    .Set(\"name\", \"John Doe\")\n    .Set(\"age\", 30);\n\n// ... same query operations as SQLite\n```\n\n## Core Concepts\n\n### Sqled\n\nA wrapper class for SQL commands that combines SQL text with parameters:\n\n```csharp\nvar sql = new Sqled(\"SELECT * FROM Users WHERE Age \u003e @minAge\")\n    .Set(\"minAge\", 18);\n\n// Fluent API for building queries\nsql.Append(\" AND Status = @status\")\n    .Set(\"status\", \"Active\");\n\n// For complex SQL, use Builder directly\nvar createTableSql = new Sqled();\ncreateTableSql.Builder.AppendLine(\"CREATE TABLE [Users](\");\ncreateTableSql.Builder.Append(\"    [Id] INTEGER NOT NULL PRIMARY KEY,\");\ncreateTableSql.Builder.Append(\"    [Name] TEXT(100) NOT NULL,\");\ncreateTableSql.Builder.AppendLine(\"    [Age] INTEGER NULL\");\ncreateTableSql.Builder.AppendLine(\");\");\n```\n\n### Key Interfaces\n\n#### IDbProvider\n\nThe main database provider interface for:\n\n- Creating database connections and commands\n- Setting parameters\n- Reading data synchronously or asynchronously\n- Getting database metadata (schemas, tables, columns, indexes)\n\n```csharp\n// Execute non-query (INSERT, UPDATE, DELETE)\nvar insertSql = new Sqled(\"INSERT INTO [Users] (Name, Age) VALUES (@name, @age)\")\n    .Set(\"name\", \"John Doe\")\n    .Set(\"age\", 30);\n\nusing var command = provider.GetDbCommand(connection);\ncommand.CommandText = insertSql.Sql;\nprovider.SetParameters(command, insertSql.Parameters);\nawait command.ExecuteNonQueryAsync();\n```\n\n#### ISqlProvider\n\nGenerates database-specific SQL for:\n\n- Database operations (create, get, drop)\n- Schema operations (create, get, drop)\n- Table operations (create, get, drop)\n- Column operations (create, rename, modify, copy, drop)\n- Index operations (create, get, drop)\n- Type conversions between .NET types and database types\n\n```csharp\n// Create a table using SQL provider\nvar columnDescriptors = new List\u003cDbColumnDesciptor\u003e\n{\n    new DbColumnDesciptor { ColumnName = \"Id\", ColumnType = \"INTEGER\", PrimaryKeyFlag = true, NullableFlag = false },\n    new DbColumnDesciptor { ColumnName = \"Name\", ColumnType = \"TEXT(100)\", PrimaryKeyFlag = false, NullableFlag = false },\n    new DbColumnDesciptor { ColumnName = \"Age\", ColumnType = \"INTEGER\", PrimaryKeyFlag = false, NullableFlag = true }\n};\n\nvar tableDesciptor = new DbTableDesciptor { TableName = \"Users\" };\nvar createTableSql = provider.SqlProvider.CreateTable(tableDesciptor, columnDescriptors);\n\nusing var command = provider.GetDbCommand(connection);\ncommand.CommandText = createTableSql.Sql;\nawait command.ExecuteNonQueryAsync();\n```\n\n## Database Comparison\n\n| Feature | SQLite | MySQL | PostgreSQL | Oracle | SQL Server | MsAccess |\n|---------|--------|-------|------------|--------|------------|----------|\n| Platform | Cross-platform | Cross-platform | Cross-platform | Cross-platform | Cross-platform | Windows only |\n| HasDatabase | No | Yes | Yes | No | Yes | No |\n| HasSchema | No | No | Yes | Yes | Yes | No |\n| Name Quoting | `[name]` | `` `name` `` | `\"name\"` | `\"name\"` | `[name]` | `[name]` |\n| Parameter Prefix | `@` | `@` | `@` | `:` | `@` | `?` (positional) |\n| Primary Key | NOT NULL PRIMARY KEY | AUTO_INCREMENT PRIMARY KEY | NOT NULL PRIMARY KEY | NOT NULL PRIMARY KEY | IDENTITY(1,1) PRIMARY KEY | AUTOINCREMENT |\n| Decimal Type | REAL | DECIMAL | NUMERIC | NUMBER | DECIMAL | CURRENCY |\n| DateTime Type | TEXT | DATETIME | TIMESTAMP | TIMESTAMP | DATETIME | DATETIME |\n| Large Text | TEXT | TEXT | TEXT | CLOB | NVARCHAR(MAX) | LONGTEXT |\n\n## Links\n\n- [Documentation](#)\n- [Issues](https://github.com/delly-net/DBunny/issues)\n- [Releases](https://github.com/delly-net/DBunny/releases)\n\n## License\n\n[MIT License](LICENSE)\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## Author\n\n© 2025 [delly.net](https://delly.net)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelly-net%2Fdbunny","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdelly-net%2Fdbunny","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelly-net%2Fdbunny/lists"}