CoreDatabase 2025.6.11

There is a newer version of this package available.
See the version list below for details.
dotnet add package CoreDatabase --version 2025.6.11
                    
NuGet\Install-Package CoreDatabase -Version 2025.6.11
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="CoreDatabase" Version="2025.6.11" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="CoreDatabase" Version="2025.6.11" />
                    
Directory.Packages.props
<PackageReference Include="CoreDatabase" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add CoreDatabase --version 2025.6.11
                    
#r "nuget: CoreDatabase, 2025.6.11"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package CoreDatabase@2025.6.11
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=CoreDatabase&version=2025.6.11
                    
Install as a Cake Addin
#tool nuget:?package=CoreDatabase&version=2025.6.11
                    
Install as a Cake Tool

CoreDatabase

Biblioteca de acceso a datos para SQL Server que proporciona una capa de abstracción robusta y fácil de usar sobre ADO.NET.

Características

  • Conexión segura a SQL Server
  • Manejo de transacciones
  • Ejecución de consultas y procedimientos almacenados
  • Soporte para parámetros SQL
  • Manejo de errores robusto
  • Soporte para operaciones asíncronas
  • Manejo de conexiones temporales
  • Integración con inyección de dependencias
  • Binding automático de objetos
  • Soporte para operaciones bulk

Instalación

El componente se puede instalar como un paquete NuGet:

dotnet add package DeveloperKit.CoreDatabase

Requisitos

  • SQL Server 2012 o superior
  • .NET Framework 4.8 o superior
  • Visual Studio 2019 o superior
  • SQL Server Native Client

Configuración

Configuración Inicial

// Configurar la conexión
services.AddScoped<IMSSqlRepository, MSSqlRepository>(provider =>
{
    var connectionString = Configuration.GetConnectionString("SqlServerConnection");
    return new MSSqlRepository(connectionString);
});

Uso

Ejemplos de Uso

// Inyección del repositorio
private readonly IMSSqlRepository _sqlRepository;

public MyService(IMSSqlRepository sqlRepository)
{
    _sqlRepository = sqlRepository;
}

// Ejecutar consulta
public async Task<DataTable> GetCustomers()
{
    var query = "SELECT * FROM CUSTOMERS WHERE ACTIVE = @active";
    
    return await _sqlRepository.ExecuteQueryAsTableAsync(query, parameters =>
    {
        parameters.Add("active", SqlDbType.Int, 1);
    });
}

// Ejecutar procedimiento almacenado
public async Task ExecuteStoredProcedure()
{
    var spName = "PKG_CUSTOMERS.GET_CUSTOMER";
    
    await _sqlRepository.ExecuteStoredProcedureAsync(spName, parameters =>
    {
        parameters.Add("p_customer_id", SqlDbType.Int, 123);
        parameters.Add("p_result", SqlDbType.Int, ParameterDirection.Output);
    });
}

// Binding automático de objetos
public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public DateTime CreatedDate { get; set; }
}

public async Task InsertCustomer(Customer customer)
{
    var query = "INSERT INTO CUSTOMERS (CustomerId, Name, CreatedDate) VALUES (@CustomerId, @Name, @CreatedDate)";
    
    await _sqlRepository.ExecuteQueryAsync(query, parameters =>
    {
        parameters.BindFrom(customer);
    });
}

Manejo de Transacciones

public async Task ExecuteWithTransaction()
{
    try
    {
        // Iniciar transacción
        _sqlRepository.BeginTransaction();
        
        // Ejecutar operaciones
        await _sqlRepository.ExecuteQueryAsync("INSERT INTO CUSTOMERS (...) VALUES (...)"));
        await _sqlRepository.ExecuteQueryAsync("UPDATE CUSTOMERS SET (...) WHERE (...)"));
        
        // Confirmar transacción
        _sqlRepository.CommitTransaction();
    }
    catch (Exception ex)
    {
        // Revertir transacción en caso de error
        _sqlRepository.RollbackTransaction();
        throw;
    }
}

Manejo de Parámetros

// Parámetros básicos
parameters.Add("p_input", SqlDbType.Varchar, "valor");

// Parámetros con tamaño
parameters.Add("p_text", SqlDbType.NVarChar, 100, "valor largo");

// Parámetros numéricos
parameters.Add("p_decimal", SqlDbType.Decimal, 18, 2, 123.45);

// Parámetros de salida
parameters.Add("p_output", SqlDbType.Int, ParameterDirection.Output);

// Parámetros de entrada/salida
parameters.Add("p_inout", SqlDbType.Int, 1, ParameterDirection.InputOutput);

Operaciones Bulk

public async Task BulkInsert(List<Customer> customers)
{
    await _sqlRepository.BulkInsertAsync("CUSTOMERS", customers, mapping =>
    {
        mapping.Column("CustomerId", x => x.CustomerId);
        mapping.Column("Name", x => x.Name);
        mapping.Column("CreatedDate", x => x.CreatedDate);
    });
}

Mejores Prácticas

  1. Siempre usar parámetros en las consultas para evitar inyección SQL
  2. Manejar transacciones para operaciones que afectan múltiples tablas
  3. Usar conexiones asíncronas para operaciones largas
  4. Implementar manejo de errores robusto
  5. Usar procedimientos almacenados cuando sea posible
  6. Implementar timeout adecuado para consultas
  7. Usar pool de conexiones para mejor rendimiento
  8. Validar datos antes de insertar/actualizar
  9. Usar binding automático para objetos complejos
  10. Implementar logging de consultas

Manejo de Errores

try
{
    await _sqlRepository.ExecuteQueryAsync(query);
}
catch (SqlException ex)
{
    // Manejo específico de errores de SQL
    if (ex.Number == 2627) // Violación de restricción única
    {
        throw new DuplicateEntryException("Ya existe un registro con esta clave");
    }
    throw;
}

Optimización de Consultas

  1. Usar parámetros en lugar de concatenación de strings
  2. Implementar timeout razonable
  3. Usar índices apropiados
  4. Evitar SELECT * cuando no es necesario
  5. Usar procedimientos almacenados para consultas complejas
  6. Implementar paginación para listados grandes
  7. Usar transacciones solo cuando sea necesario

Soporte

Para reportar errores o solicitar características, por favor abre un issue en el repositorio de GitHub.

Licencia

Este proyecto está bajo licencia MIT. Consulta el archivo LICENSE para más detalles.

  • void CommitTransaction()
    Confirma la transacción activa y cierra la conexión.

  • void RollbackTransaction()
    Revierte la transacción activa y cierra la conexión.

Consultas y ejecución

  • DataTable GetTableFromQuery(string query, Action<IDataParameterCollection> parameter = null)
    Ejecuta una consulta SQL y devuelve un DataTable con los resultados.

  • DataTable GetTableFromStoredProcedure(string procedimientoAlmacenado, Action<IDataParameterCollection> parameter = null)
    Ejecuta un procedimiento almacenado y devuelve un DataTable.

  • T GetItemFromQuery<T>(string query, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Ejecuta una consulta y transforma la primera fila a un objeto del tipo T.

  • T GetItemFromStoredProcedure<T>(string procedimientoAlmacenado, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Igual que el anterior, pero con procedimiento almacenado.

  • ICollection<Dictionary<string, object>> GetDictionaryFromQuery(string query, Action<IDataParameterCollection> parameter = null)
    Obtiene resultados de consulta como una colección de diccionarios con nombre/valor.

  • ICollection<Dictionary<string, object>> GetDictionaryFromStoredProcedure(string procedimientoAlmacenado, Action<IDataParameterCollection> parameter = null)
    Igual que el anterior, pero para procedimientos almacenados.

  • ICollection<T> GetItemsFromStoredProcedure<T>(string procedimientoAlmacenado, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Obtiene una colección de objetos tipo T a partir de un procedimiento almacenado.

  • ICollection<T> GetItemsFromQuery<T>(string query, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Obtiene una colección de objetos tipo T a partir de una consulta SQL.

Ejecución de comandos

  • void ExecuteNonQuery(string command, Action<IDataParameterCollection> parameter = null)
    Ejecuta comandos SQL que no retornan datos (INSERT, UPDATE, DELETE, etc.).

  • void ExecuteInsert<T>(string tableName, T entity) where T : class, new()
    Inserta un único objeto en la tabla especificada usando reflexión.

  • void ExecuteInsert<T>(string tableName, ICollection<T> collection) where T : class, new()
    Inserta una colección de objetos en la tabla especificada.

  • void ExecuteStoredProcedureCommand(string procedimientoAlmacenado, Action<IDataParameterCollection> parameter = null)
    Ejecuta un procedimiento almacenado que no devuelve resultados.

Operaciones Bulk Copy

  • void ExecuteBulkCopyToTable(DataTable source, string destinationTable)
    Borra la tabla destino, la crea según la estructura de la tabla fuente y realiza la inserción masiva.

  • void ExecuteBulkCopy(DataTable source, string destinationTable)
    Inserción masiva desde un DataTable.

  • void ExecuteBulkCopy(IDataReader source, string destinationTable)
    Inserción masiva desde un IDataReader.

Otros métodos útiles

  • DateTime GetCurrentDateTime()
    Obtiene la fecha y hora actual del servidor SQL.

  • Métodos para crear parámetros SQL para consultas y procedimientos almacenados (AddParameter).

  • Métodos para configurar la conexión (SetDatabaseLogon).

Métodos Asíncronos de IMSSqlRepository

La interfaz también define métodos asíncronos para mejorar el rendimiento y escalabilidad de las operaciones de base de datos.

Métodos asíncronos principales

  • Task<T> GetItemFromQueryAsync<T>(string query, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Ejecuta una consulta SQL asíncrona y transforma la primera fila en un objeto T.

  • Task<T> GetItemFromStoredProcedureAsync<T>(string procedimientoAlmacenado) where T : new()
    Ejecuta un procedimiento almacenado de forma asíncrona y devuelve un objeto T por defecto.

  • Task<T> GetItemFromStoredProcedureAsync<T>(string procedimientoAlmacenado, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Ejecuta un procedimiento almacenado de forma asíncrona y mapea la primera fila a un objeto T.

  • Task<DataTable> GetTableFromQueryAsync(string query, Action<IDataParameterCollection> parameter = null)
    Ejecuta una consulta asíncrona y devuelve un DataTable con los resultados.

  • Task<DataTable> GetTableFromStoredProcedureAsync(string procedimientoAlmacenado, Action<IDataParameterCollection> parameter = null)
    Ejecuta un procedimiento almacenado de forma asíncrona y devuelve un DataTable.

  • Task<ICollection<Dictionary<string, object>>> GetDictionaryFromQueryAsync(string query, Action<IDataParameterCollection> parameter = null)
    Ejecuta una consulta asíncrona y devuelve una colección de diccionarios.

  • Task<ICollection<Dictionary<string, object>>> GetDictionaryFromStoredProcedureAsync(string procedimientoAlmacenado, Action<IDataParameterCollection> parameter = null)
    Igual que el anterior, pero para procedimientos almacenados.

  • Task<ICollection<T>> GetItemsFromQueryAsync<T>(string query, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Obtiene una colección de objetos T de una consulta asíncrona.

  • Task<ICollection<T>> GetItemsFromStoredProcedureAsync<T>(string storedProcedure) where T : new()
    Obtiene una colección de objetos T de un procedimiento almacenado asíncrono.

  • Task<ICollection<T>> GetItemsFromStoredProcedureAsync<T>(string storedProcedure, Func<IDataReader, T> expression, Action<IDataParameterCollection> parameter = null)
    Igual que el anterior, pero con mapeo personalizado.

Comandos asíncronos

  • Task<int> ExecuteStoredProcedureCommandAsync(string storedProcedure, Action<IDataParameterCollection> parameter = null)
    Ejecuta un procedimiento almacenado asíncrono que devuelve el número de filas afectadas.

  • Task ExecuteNonQueryAsync(string command, Action<IDataParameterCollection> parameter = null)
    Ejecuta un comando SQL que no retorna datos de forma asíncrona.

  • Task ExecuteBulkCopyToTableAsync(DataTable sourceTable, string destinationTable)
    Realiza una inserción masiva asíncrona creando la tabla destino.

  • Task ExecuteBulkCopyAsync(DataTable source, string destinationTable)
    Inserción masiva asíncrona desde un DataTable.

  • Task ExecuteBulkCopyAsync(IDataReader source, string destinationTable)
    Inserción masiva asíncrona desde un IDataReader.

  • Task ExecuteInsertAsync<T>(string tableName, T entity)
    Inserta un objeto de forma asíncrona en la tabla especificada.

  • Task ExecuteInsertAsync<T>(string tableName, ICollection<T> collection)
    Inserta una colección de objetos de forma asíncrona.

  • Task<DateTime> GetCurrentDateTimeAsync()
    Obtiene la fecha y hora actual del servidor SQL de forma asíncrona.

Métodos para manejo de tablas en IMSSqlRepository

Además de los métodos para manipulación de datos, la interfaz incluye operaciones para gestionar tablas directamente:

  • void DropTable(string tableName)
    Elimina la tabla especificada de la base de datos.

  • void CreateTable(DataTable sourceTable, string destinationTable)
    Crea una tabla en la base de datos a partir de la estructura de un DataTable.

  • void CreateTable(IDataReader reader, string destinationTable)
    Crea una tabla en la base de datos basándose en la estructura del IDataReader.

Interfaz IServiceProviderKeyed

Esta interfaz proporciona un mecanismo para obtener servicios basados en una clave específica:

public interface IServiceProviderKeyed
{
    TService GetKeyedService<TService, TKeyed>(TKeyed key);
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddMicrosoftSQL(provider =>
    {
        // Aquí configuras la instancia concreta de IMSSqlRepository
        IMSSqlRepository repo = new MSSqlRepository();
        repo.SetDatabaseLogon("Server=myServer;Database=myDB;User Id=myUser;Password=myPassword;");
        return repo;
    }, ServiceLifetime.Scoped);
}
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2025.7.24 372 7/24/2025
2025.7.21 422 7/22/2025
2025.7.20 180 7/20/2025
2025.7.19 178 7/20/2025
2025.7.18 26 7/18/2025
2025.7.17 111 7/17/2025
2025.7.14 120 7/14/2025
2025.7.13 118 7/14/2025
2025.7.9 124 7/8/2025
2025.7.8 119 7/8/2025
2025.7.3 335 7/4/2025
2025.7.2 338 7/4/2025
2025.6.11 273 6/11/2025
2025.5.26 90 5/24/2025
2025.5.25 56 5/24/2025
2025.5.24 55 5/24/2025
2025.5.23 58 5/23/2025
2025.5.20 126 5/21/2025
2025.5.15 216 5/15/2025
2025.5.8 148 5/8/2025
2025.5.6 132 5/6/2025
2025.5.4 137 5/4/2025
2025.5.1 136 5/1/2025
2025.4.30 134 4/30/2025
2025.4.29 123 4/27/2025
2025.4.28 82 4/26/2025
2025.4.27 88 4/26/2025
2025.4.26 88 4/26/2025
2025.4.12 119 4/12/2025
2025.4.4 96 4/5/2025
2025.3.24 484 3/25/2025
2025.3.22 153 3/22/2025
2025.3.11 159 3/11/2025
2025.3.9 165 3/10/2025
2025.3.8 130 3/9/2025
2025.2.16 210 2/17/2025
2025.2.3 103 2/3/2025
2025.2.2 113 2/2/2025
2025.2.1 105 2/1/2025
2025.1.31 92 1/29/2025
2025.1.30 95 1/28/2025
2025.1.29 95 1/28/2025
2025.1.28 95 1/28/2025
2025.1.18 98 1/15/2025
2025.1.17 88 1/13/2025
2025.1.16 80 1/13/2025
2025.1.15 89 1/13/2025
2025.1.14 81 1/13/2025
2025.1.13 85 1/12/2025
2025.1.12 83 1/12/2025
2025.1.7 109 1/7/2025
2024.12.29 107 12/28/2024
2024.12.28 104 12/28/2024
2024.12.19 109 12/19/2024
2024.12.18 107 12/19/2024 2024.12.18 is deprecated because it is no longer maintained and has critical bugs.
2024.12.4 121 12/4/2024
2024.12.2 104 12/2/2024
2024.11.30 111 12/1/2024
2024.11.13 115 11/13/2024
2024.11.12 110 11/12/2024
2024.10.10 122 10/11/2024
2024.10.9 109 10/9/2024
2024.10.7 119 10/4/2024
2024.10.6 102 10/4/2024
2024.10.4 111 10/3/2024
2024.9.8 101 9/9/2024
2024.9.5 121 9/6/2024
2024.8.13 136 8/14/2024
2024.8.2 99 8/1/2024
2024.8.1 93 8/1/2024
2024.7.24 119 7/24/2024
2024.6.9 107 6/10/2024
2024.4.22 133 4/23/2024
2024.4.16 123 4/15/2024
2024.4.15 108 4/15/2024
2024.4.14 133 4/14/2024
2024.4.13 112 4/13/2024
2024.4.12 115 4/13/2024
2024.4.7 119 4/8/2024
2024.2.18 128 2/24/2024
2024.1.2 198 1/2/2024
2023.12.26 136 12/26/2023
2023.11.30 151 12/11/2023
2023.11.28 128 11/27/2023
2023.11.15 173 11/16/2023
2023.11.10 155 11/10/2023
2023.10.29 131 10/30/2023
2023.8.17 158 8/18/2023
2023.8.14 139 8/14/2023
2023.8.9 144 8/9/2023
2023.8.1 166 7/31/2023
2023.7.31 162 7/31/2023
2023.7.30 165 7/31/2023
2023.7.26 172 7/26/2023
2023.7.25 170 7/25/2023
2023.7.11 176 7/12/2023
2023.7.6 163 7/7/2023
2023.6.19 171 6/20/2023
2023.6.18 165 6/19/2023
2023.5.20 173 5/16/2023
2023.5.19 171 5/13/2023
2023.5.14 168 5/8/2023
2023.5.10 175 5/4/2023
2023.5.6 191 4/29/2023
2023.4.28 247 4/26/2023