Saltar al contenido principal

Dinaup.Database

Libreria .NET que proporciona una interfaz simplificada para trabajar con PostgreSQL. Compatible con .NET Framework y .NET Core. Thread-safe con reutilizacion de conexion.

Instalacion

dotnet add package Dinaup.Database

Codigo fuente: github.com/DinaupSoftware/Dinaup.Database

Clase principal: PGClient

Conexion

// Conexion basica
var client = new PGClient();
client.Connect("localhost", 5432, "myuser", "mypassword", "mydatabase");

// Conexion con SSL (cadena URL)
client.ConnectWithSSL("postgres://user:password@host:port/dbname?sslmode=require");

// Conexion con SSL (parametros separados)
client.ConnectWithSSL("host", 5432, "user", "password", "databaseName");

Lectura de datos

// Valor unico
var count = client.ReadValue("SELECT COUNT(*) FROM test_table;");

// Lista de una columna
var nombres = client.ReadList("SELECT name FROM test_table ORDER BY id;");

// Lista de diccionarios (una fila por diccionario)
var registros = client.ReadDictionaryList("SELECT id, name, value FROM test_table WHERE id < 10;");
foreach (var reg in registros)
{
Console.WriteLine($"ID: {reg["id"]}, Name: {reg["name"]}");
}

Lectura con modelos tipados

Las clases que heredan de BaseModelConverter se mapean directamente desde resultados SQL:

public class TestModel : BaseModelConverter
{
public int Id { get; set; }
public string Name { get; set; }
public int Value { get; set; }

public override void FromDic(Dictionary<string, string> dic)
{
this.Id = dic.GetM("id").INT(0);
this.Name = dic.GetM("name");
this.Value = dic.GetM("value").INT(0);
}

public override string Table => "test_table";
public override string[] Fields => new[] { "id", "name", "value" };
public override string LastModifiedFieldDatetimeUTC => "";
}

var modelos = client.ReadObjectList<TestModel>("SELECT * FROM test_table ORDER BY id;");

Insercion, actualizacion y upsert

// Insertar
var nuevo = new Dictionary<string, string> { {"name", "Nuevo"}, {"value", "100"} };
client.InsertRecord("test_table", nuevo);

// Actualizar
var datos = new Dictionary<string, string> { {"value", "999"} };
client.UpdateRecord("test_table", datos, "id", "1");

// Upsert (insertar o actualizar)
var registro = new Dictionary<string, string> { {"id", "100"}, {"name", "Reg100"}, {"value", "1000"} };
client.InsertOrUpdateRecord("test_table", registro, "id");

// Insertar multiples registros
client.InsertRecords("test_table", listaDeRegistros);

// Upsert multiples registros
client.InsertOrUpdateRecords("test_table", listaDeRegistros, "id");

Lectura en lotes

Para grandes voluminenes de datos, la lectura por lotes evita cargar todo en memoria:

var batches = client.BatchReadDictionaries(
"Lectura en lotes",
"SELECT COUNT(*) FROM test_table",
"SELECT id, name, value FROM test_table ORDER BY id",
1000
);

foreach (var batch in batches)
{
Console.WriteLine("Lote de " + batch.Count + " registros");
}

Clonar conexion y liberar recursos

// Crear nueva instancia con misma configuracion
var clone = client.DuplicateConnection();

// PGClient implementa IDisposable
using (var client = new PGClient())
{
client.Connect("localhost", 5432, "user", "pass", "db");
// ... operaciones ...
}
info

PGClient es thread-safe y reutiliza la conexion. Para operaciones concurrentes, usa DuplicateConnection() para crear instancias independientes.