Adfines.Net.Ganesha es un paquete NuGet diseñado para simplificar y optimizar la gestión de múltiples tipos de bases de datos en aplicaciones .NET 6+. Soporta MySQL, SQL Server, PostgreSQL y Oracle con una API unificada.
dotnet add package Adfines.Net.Ganesha
// Para encriptar contraseñas (cuando AfCrypt = true)
string passwordEncriptado = Adfines.Net.Ganesha.Xtra.Password.E("Hola mundo");
Console.WriteLine(passwordEncriptado);
// El valor retornado es el que se debe colocar en Password cuando AfCrypt es true
using Adfines.Net.Ganesha.Utils;
var mysql = new MySql(new Initializer()
{
AfCrypt = true,
Bdd = "onepiece",
User = "root",
Password = "SbBW2UXX83XHhG9Wr/tVQ9beTQ/W59hYTf2FMqL/K4A=",
Ip = "localhost",
Port = 3306,
SslMode = "2"
});
var sqlServer = new SqlServer(new Initializer()
{
AfCrypt = true,
Bdd = "prod",
User = "sa",
Password = "SbBW2UXX83XHhG9Wr/tVQ13gAq5/rlkTkE22fgB/Nlw=",
IntegratedSecurity = false,
TrustCertificate = true
});
var postgresql = new PostgreSql(new Initializer()
{
AfCrypt = true,
Bdd = "postgres",
User = "odoo",
Password = "SbBW2UXX83XHhG9Wr/tVQzBYlM7x4OaeU8ohdoTdWSg=",
TrustCertificate = true
});
var oracle = new Oracle(new Initializer()
{
AfCrypt = true,
Bdd = "XE",
User = "system",
Password = "SbBW2UXX83XHhG9Wr/tVQzzsIpm04BOM7m2vZqvEAAk=",
Protocol = "1" // 1: TCP, 2: TCPS, 3: IPC, 4: NMP, 5: SDP
});
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
AfCrypt | bool | ✅ | Habilita cifrado de credenciales |
Bdd | string | ✅ | Nombre de la base de datos |
User | string | ✅ | Usuario |
Password | string | ✅ | Contraseña (cifrada/plana) |
Ip | string | ❌ | IP/hostname (default: localhost) |
Port | int | ❌ | Puerto |
Error | string | ❌ | Tabla para logs de errores |
Warning | string | ❌ | Tabla para logs de advertencias |
ConnectionTimeOut | int | ❌ | Timeout conexión (segundos) |
QueryTimeOut | int | ❌ | Timeout consulta (segundos) |
PoolSize | int | ❌ | Tamaño pool conexiones |
| Base de Datos | Parámetros Específicos |
|---|---|
| MySQL | SslMode: "1"-"5" |
| SQL Server | IntegratedSecurity, TrustCertificate |
| PostgreSQL | TrustCertificate |
| Oracle | Protocol: "1"-"5" |
var msql = new MySql(new Initializer()
{
AfCrypt = true,
Bdd = "onepiece",
User = "root",
Password = "SbBW2UXX83XHhG9Wr/tVQ9beTQ/W59hYTf2FMqL/K4A="
});
var msql = new MySql("EjemploMysql");
appsettings.json:
{
"AdfinesGaneshaNet": {
"EjemploMysql": {
"AfCrypt": true,
"Bdd": "onepiece",
"User": "root",
"Password": "SbBW2UXX83XHhG9Wr/tVQ9beTQ/W59hYTf2FMqL/K4A="
}
}
}
var msql = new MySql(new Initializer(
afCrypt: true,
bdd: "onepiece",
user: "root",
password: "SbBW2UXX83XHhG9Wr/tVQ9beTQ/W59hYTf2FMqL/K4A=",
ip: "localhost",
port: 3306
));
// JSON
var msql = new MySql(new Initializer("/ruta", "config", "json"));
// CSV
var msql = new MySql(new Initializer("/ruta", "config", "csv"));
if (mysql.Success)
{
Console.WriteLine("Conexión exitosa a la base de datos");
}
var resultado = mysql.Select(
"SELECT * FROM usuarios WHERE edad > @edad",
new() { ["edad"] = 18 },
"Error al obtener usuarios"
);
var insercion = mysql.Insert(
"usuarios (nombre, email) VALUES (@nombre, @email)",
new() { ["nombre"] = "Juan", ["email"] = "juan@ejemplo.com" },
"Error al insertar usuario"
);
var actualizacion = mysql.Update(
"usuarios SET activo = 1 WHERE id = @id",
new() { ["id"] = 1 },
"Error al actualizar usuario"
);
var eliminacion = mysql.Delete(
"usuarios WHERE id = @id",
new() { ["id"] = 1 },
"Error al eliminar usuario"
);
var raw = mysql.Raw(@"
INSERT INTO log (accion) VALUES ('inicio');
UPDATE contador SET valor = valor + 1;
", "Error en consultas raw");
var inserted = mysql.Inserted(
"usuarios (nombre) VALUES (@nombre)",
new() { ["nombre"] = "Maria" },
"Error al insertar"
);
| Propiedad | Tipo | Descripción |
|---|---|---|
Err.Flag | bool | true si hubo error en la consulta |
Err.Id | long | ID del registro de error en la tabla de logs |
First.Dic | Dictionary<string, object?> | Primer registro como Dictionary |
First.Obj | JObject | Primer registro como JObject (Newtonsoft) |
Info.List | IList<Dictionary<string, object?>> | Todos los registros como lista de Dictionary |
Info.Array | JArray | Todos los registros como JArray (Newtonsoft) |
Info.Count | int | Número total de registros |
| Propiedad | Tipo | Descripción |
|---|---|---|
Ok | bool | true si la operación fue exitosa |
Err | long | ID del registro de error (0 si no hubo error o no se pudo guardar) |
| Propiedad | Tipo | Descripción |
|---|---|---|
Id | long | ID del registro insertado (si la tabla tiene identity/autoincrement) |
Error.Flag | bool | true si hubo error en la inserción |
Error.Id | long | ID del registro de error en la tabla de logs |
| Propiedad | Tipo | Descripción |
|---|---|---|
Flag | bool | Nota: Comportamiento invertido. true = éxito, false = error al guardar |
Id | long | ID del registro creado en la tabla de logs |
| Propiedad | Tipo | Descripción |
|---|---|---|
List | IList<string> | Lista de esquemas o tablas |
Column | List<Column> | Lista de columnas con metadatos |
Err.Flag | bool | true si hubo error |
Err.Id | long | ID del registro de error |
| Propiedad | Tipo | Descripción |
|---|---|---|
Name | string | Nombre de la columna |
Item | int? | Posición/orden de la columna |
Type | string | Tipo de dato de la columna |
Length | int? | Longitud máxima de la columna |
Scale | int? | Escala (para tipos decimales) |
Presicion | int? | Precisión (para tipos numéricos) |
Null | bool? | true si permite valores NULL |
Increment | bool? | true si es auto-incremental |
DefaultValue | string | Valor por defecto de la columna |
Collation | string | Collation/ordenamiento |
Description | string | Descripción de la columna |
Definition | string | Definición completa |
Persisted | bool? | true si es persistente |
SequenceName | string | Nombre de la secuencia (si aplica) |
SequenceSchema | string | Esquema de la secuencia (si aplica) |
// Listar todas las tablas
var tablas = mysql.Props();
foreach (var tabla in tablas.List)
{
Console.WriteLine($"Tabla: {tabla}");
}
// Obtener columnas de una tabla
var columnas = mysql.Props("usuarios");
foreach (var columna in columnas.Column)
{
Console.WriteLine($"Columna: {columna.Name}, Tipo: {columna.Type}, Nulo: {columna.Null}");
}
// Listar todos los esquemas
var esquemas = sqlServer.Props();
foreach (var esquema in esquemas.List)
{
Console.WriteLine($"Esquema: {esquema}");
}
// Listar tablas de un esquema
var tablas = sqlServer.Props("dbo");
foreach (var tabla in tablas.List)
{
Console.WriteLine($"Tabla: {tabla}");
}
// Obtener columnas de una tabla en un esquema
var columnas = sqlServer.Props("dbo", "usuarios");
foreach (var columna in columnas.Column)
{
Console.WriteLine($"Columna: {columna.Name}, Tipo: {columna.Type}");
}
CREATE TABLE error_table(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
creacion DATETIME NOT NULL,
valor TEXT NOT NULL,
codigo TEXT NOT NULL,
descripcion TEXT NOT NULL
);
CREATE TABLE warn_table(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
creacion DATETIME NOT NULL,
valor TEXT NOT NULL,
codigo TEXT NOT NULL,
descripcion TEXT NOT NULL
);
Los errores en consultas SELECT, INSERT, UPDATE, DELETE se registran automáticamente cuando se proporciona el parámetro de descripción de error.
try
{
// Operación riesgosa
var numero = "hola mundo";
var i = int.Parse(numero);
}
catch (Exception e)
{
// Registrar error
var error = mysql.Error(e, "Dio error al tratar de convertir un numero: " + numero);
// Registrar advertencia
var warning = mysql.Warning(e, "No se pudo convertir el numero " + numero);
// NOTA: Flag se invierte para consultas de error puras
if (!error.Flag) // true = éxito, false = error al guardar
{
Console.WriteLine("Hubo un error al tratar guardar el error");
}
else
{
Console.WriteLine("id del error: " + error.Id);
}
}
var mysql = new MySql(new Initializer() {
AfCrypt = true,
Bdd = "onepiece",
User = "root",
Password = "SbBW2UXX83XHhG9Wr/tVQ9beTQ/W59hYTf2FMqL/K4A=",
Error = "error_table",
Warning = "warn_table"
});
if (mysql.Success)
{
Console.WriteLine("Conexión exitosa a la base de datos");
// SELECT con parámetros
var usuarios = mysql.Select(
"SELECT * FROM luffy WHERE id > @id AND nombre LIKE @nombre",
new()
{
["id"] = 0,
["nombre"] = "%lu%"
},
"Problemas al querer listar luffy"
);
if (usuarios.Err.Flag)
{
if (usuarios.Err.Id < 1)
{
Console.WriteLine("No se pudo guardar el error en la base de datos");
}
else
{
Console.WriteLine("Hubo un error. ID del error: " + usuarios.Err.Id);
}
}
else
{
// Procesar resultados en diferentes formatos
Dictionary<string, object?> primerRegistro = usuarios.First.Dic;
JObject primerRegistroJson = usuarios.First.Obj;
IList<Dictionary<string, object?>> todosRegistros = usuarios.Info.List;
JArray todosRegistrosJson = usuarios.Info.Array;
int totalRegistros = usuarios.Info.Count;
Console.WriteLine($"Total de registros: {totalRegistros}");
// Advertencia condicional
if (totalRegistros > 100)
{
mysql.Warning(new ArgumentException(), "La tabla ya tiene mas de 100 registros");
}
}
}
var inserted = mysql.Inserted(
@"luffy (nombre, creacion, edad, poder, activo) VALUES (@nombre, @creacion, @edad, @poder, @activo)",
new()
{
["nombre"] = "luis 3",
["creacion"] = "TIMESTAMP()",
["edad"] = 89,
["poder"] = 55.5,
["activo"] = null
},
"Hubo un error al querer insertar en luffy"
);
if (inserted.Error.Flag)
{
if (inserted.Error.Id < 1)
{
Console.WriteLine("No se pudo insertar el id del error o no se pudo recuperar el id de la tabla error");
}
else
{
Console.WriteLine("id del error al insertar: " + inserted.Error.Id);
}
}
else
{
Console.WriteLine($"Inserción exitosa. ID: {inserted.Id}");
}
var insercionMultiple = mysql.Inserts("luffy",
[
new()
{
["nombre"] = "luis 4",
["creacion"] = "TIMESTAMP()",
["edad"] = 89,
["poder"] = 55.5,
["activo"] = null
},
new()
{
["nombre"] = "luis 5",
["creacion"] = "TIMESTAMP()",
["edad"] = 90,
["poder"] = 60.0,
["activo"] = 1
}
], "Hubo un error al querer insertar en luffy");
if (!insercionMultiple.Ok)
{
Console.WriteLine("Error en inserción múltiple. ID error: " + insercionMultiple.Err);
}
var activoLuffyRaw = 1;
var consultasRaw = mysql.Raw(@"
INSERT INTO luffy (nombre, creacion, edad, poder) VALUES ('luis 55', TIMESTAMP(), 80, 22.2);
UPDATE luffy SET activo = {activoLuffyRaw} WHERE nombre = 'luis 55';
DELETE FROM luffy WHERE edad > 100;
", "Hubo un error al ejecutar una consulta cruda");
if (!consultasRaw.Ok)
{
Console.WriteLine("Error en consultas RAW. ID error: " + consultasRaw.Err);
}
Use la clase correspondiente:
MySql para MySQL/MariaDBSqlServer para SQL ServerPostgreSql para PostgreSQLOracle para OracleSí, por razones de seguridad todas las bases de datos requieren WHERE en UPDATE/DELETE.
En consultas de error puras (Error() y Warning()), Flag = true significa éxito y Flag = false significa error. Esto es diferente a otras operaciones.
Use Inserted() en lugar de Insert() para obtener el ID del registro insertado.
Sí, use Raw() con consultas separadas por punto y coma.
Password.E() para encriptarSuccess después de crear la instanciaProps()