Adfines.Net.Ganesha es un paquete NuGet para .NET que facilita la interacción con bases de datos y APIs. Ofrece:
Select: Utilizado para seleccionar elementos de una tabla o vista.
Exec: Ejecuta un procedimiento almacenado.
Insert: Realiza una inserción de datos en una tabla.
Update: Actualiza los datos de una tabla.
Delete: Elimina un registro de una tabla.
Raw: Permite ejecutar cualquier script en la base de datos.
GetInserted: Retorna el ID insertado de la tabla si tiene auto incrementable
Props: Proporciona información sobre una base de datos, con tres sobrecargas:
a. Información de los esquemas.
b. Información de las tablas dentro de un esquema.
c. Información de las propiedades de una tabla en un esquema.
create table documentation.error (
id serial4 not null primary key,
creacion timestamp not null,
valor text not null,
codigo text not null,
descripcion text not null
);
create table documentation.warn (
id serial4 not null primary key,
creacion timestamp not null,
valor text not null,
codigo text not null,
descripcion text not null
);
create table documentation.error (
id int identity(1,1) not null primary key,
creacion datetime not null,
valor varchar(max) not null,
codigo varchar(max) not null,
descripcion varchar(max) not null,
);
create table documentation.warn (
id int identity(1,1) not null primary key,
creacion datetime not null,
valor varchar(max) not null,
codigo varchar(max) not null,
descripcion varchar(max) not null,
);
create table documentation_error (
id int auto_increment not null primary key,
creacion datetime not null,
valor text not null,
codigo text not null,
descripcion text not null
);
create table documentation_warn (
id int auto_increment not null primary key,
creacion datetime not null,
valor text not null,
codigo text not null,
descripcion text not null
);
Existen 4 formas distintas de iniciar una conexión a una base de datos con Ganesha y posteriormente se puede verificar si la conexión a la base de datos se ha establecido exitosamente.
Cada base de datos tiene una clase correspondiente con el mismo nombre para diferenciar entre las conexiones que se desean establecer. Sin embargo, el uso, la instanciación, la inicialización de la conexión, la consulta y la gestión de la base de datos se realizan de manera uniforme.
Nota: Ganesha
únicamente tiene la capacidad de conectarse a una base de datos a través de un
puerto. Si observa un nombre de instancia en lugar de un puerto en una
conexión, debe determinar el puerto en el que se encuentra abierta esa base de
datos.
Cabe señalar que esta es solo una de las muchas formas posibles de implementar la conexión desde una clase. Dado que se trata de una clase, el límite está en la creatividad del desarrollador.
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
PostgreSql psql = new CtxPsql().Psql;
Console.WriteLine(psql.Success);
class CtxPsql
{
public PostgreSql Psql;
public CtxPsql()
{
Initializer initializer = new Initializer()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
Psql = new PostgreSql(initializer);
}
}
Archivo appsettings.json
{
"AdfinesGaneshaNet": {
"ConeccionPostgreSql": {
"Ip": "localhost",
"Port": 5432,
"PoolSize": 10,
"Bdd": "prueba2",
"User": "postgres",
"Password": "root#",
"Error": "documentation.error",
"Warning": "documentation.warn"
}
}
}
Clase main para acceder a la base de datos
using Adfines.Net.Ganesha.Bdd;
PostgreSql psql = new PostgreSql("ConeccionPostgreSql");
Console.WriteLine(psql.Success);
using Adfines.Net.Ganesha.Bdd;
PostgreSql psql = new PostgreSql
(
"localhost",
5432,
10,
"prueba2",
"postgres",
"root",
"documentation.error",
"documentation.warn"
);
Console.WriteLine(psql.Success);
Se creará un archivo json
en el mismo nivel del archivo compilado llamado: ctx1.json
Dentro del archivo se colocará lo siguiente
{
"ip": "localhost",
"port": 5432,
"pool": 10,
"bdd": "prueba2",
"user": "postgres",
"password": "root#",
"error": "documentation.error",
"warning": "documentation.warn"
}
Para establecer la conexión solo tendríamos que establecer los siguientes parámetros desde nuestra clase principal
using Adfines.Net.Ganesha.Bdd;
PostgreSql psql = new PostgreSql("", "ctx1", "json");
Console.WriteLine(psql.Success);
El
primer parámetro es para especificar la ruta del archivo, el segundo su nombre
y el tercero su extensión. Si el archivo no se encuentra en la raíz del
proyecto y se encuentra en cualquier ubicación. Solamente colocar el path de la
maquina o el path de red de otro equipo para que pueda leer la configuración.
Se creará un archivo json
en el mismo nivel del archivo compilado llamado: ctx1.chillon
Dentro del archivo se colocará lo siguiente
localhost;5432;10;prueba2;postgres;root;documentation.error;documentation.warn
Para establecer la conexión solo tendríamos que establecer los siguientes parámetros desde nuestra clase principal
using Adfines.Net.Ganesha.Bdd;
PostgreSql psql = new PostgreSql("", "ctx1", "chillon");
Console.WriteLine(psql.Success);
El
primer parámetro es para especificar la ruta del archivo, el segundo su nombre
y el tercero su extensión. Si el archivo no se encuentra en la raíz del
proyecto y se encuentra en cualquier ubicación. Solamente colocar el path de la
maquina o el path de red de otro equipo para que pueda leer la configuración.
Si no se necesitan las tablas de error y advertencia simplemente dejar los espacios en blanco
Para implementar en SqlServer y MySql simplemente cambiar el nombre de la clase PostgreSql a MySql y SqlServer
Por problemas de espacios de nombres, la clase MySql no se puede utilizar libremente. Para ello tiene dos opciones
Utilizar el nombre completo de la clase y su ubicación:
Adfines.Net.Ganesha.Bdd.MySql psql = new("", "ctx1", "chillon");
Console.WriteLine(psql.Success);
O utilizar un alias
using MSQL = Adfines.Net.Ganesha.Bdd.MySql;
MSQL psql = new("", "ctx1", "chillon");
Console.WriteLine(psql.Success);
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*creacion de variable string que posteriormente se convertira a int*/
string number = "valentina";
try
{
/*intentar convertir */
int convert = int.Parse(number);
}
catch (Exception e)
{
/*
tanto .Error como .Warning reciben dos parametros
1. parametro de tipo Exception
2. descripcion del error para que se inserte en la base de datos (opcional)
estos metodos retornan dos variables
1. error: se refiere a si ha habido un error cuando se intento escribir el error en la base de datos
2. idError: el id que retorna la tabla al insertar el error
*/
(bool error, long idError) = psql.Error(e, $"Ocurrio un error tratando de convertir {number} a numero");
(bool warn, long idWarn) = psql.Warning(e, $"{number} no es un numero");
}
/*Crear una clase para instanciar la coneccion*/
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
Las tablas de errores y de advertencias que utiliza Ganesha también pueden ser utilizadas por try catch desde su propio código.
Al
insertarse el error y la advertencia en las tablas correspondientes se vera
literalmente el error del propio c# (si se pasa la variable de Exception) y la
descripción que se le ha colocado (opcional) aparte de la fecha y hora exacta
en la que se coloco.
Para evitar la creación de
tantas tablas y bases de datos. Para estos ejemplos solamente se utilizará la
tabla ejemplo en el esquema documentación.
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*
select recibe 2 parametros
1. la consulta sql
2. mensaje descriptivo para error, si la consulta da error esa descripcion se insertara en la tabla de errores
select retorna 7 variables
list: List<IDictionary<string, object>> de los elementos seleccionados
error: variable tipo bool en el caso de error la consulta (true o false)
array: JArray de los elementos seleccionados
firstd: primer objeto seleccionado IDictionary<string, object>
firsto: primer objeto seleccionado JObject
count: indicador de cuantos elementos hay en la lista
errorId: el id de la tabla de error que se inserto si la consulta dio error
NOTA
a la consulta no se le indica el Select
*/
var (list, error, array, firstd, firsto, count, errorId) = psql.Select
(
"* from documentation.ejemplo",
"no se pudo extraer la informacion de la tabla ejemplo"
);
/*si la consulta dio error se saldra del ejecutable y pintara en pantalla que ha dado error la consulta*/
if (error)
{
Console.WriteLine($"Hubo un error especificado en el ID: {errorId}");
return;
}
Console.WriteLine(array.ToString());
/*Crear una clase para instanciar la coneccion*/
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
Si el aplicativo no falla
en ninguna ocasión, al final pintara en consola la información de la base de
datos en su forma arreglo > objeto.
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*
insert recibe 2 parametros
1. la consulta sql
2. mensaje descriptivo para error, si la consulta da error esa descripcion se insertara en la tabla de errores
insert retorna 2 variables
success: si la consulta se ejecuto sin ningun problema
errorId: si la consulta tubo problemas retornara el valor de la columna id que se inserto en error
NOTA
a la consulta no se le indica el insert into
*/
var (success, errorId) = psql.Insert
(
"documentation.ejemplo (nombre,edad) values ('daniel enrique', 25)",
"No se pudo insertar un ejemplo"
);
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
Si el aplicativo no falla en ningúna ocacion al finalizar retornara lo siguiente
Success: true
errorId: 0
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*
insert recibe 2 parametros
1. la consulta sql
2. mensaje descriptivo para error, si la consulta da error esa descripcion se insertara en la tabla de errores
insert retorna 2 variables
success: si la consulta se ejecuto sin ningun problema
errorId: si la consulta tubo problemas retornara el valor de la columna id que se inserto en error
NOTA
a la consulta no se le indica el insert into
*/
var (success, errorId) = psql.Update
(
"documentation.ejemplo set nombre = 'daniel perez' where id = 3",
"No se pudo editar el ejemplo 3"
);
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
Si el aplicativo no falla en ningúna ocacion al finalizar retornara lo siguiente
Success: true
errorId: 0
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*
insert recibe 2 parametros
1. la consulta sql
2. mensaje descriptivo para error, si la consulta da error esa descripcion se insertara en la tabla de errores
insert retorna 2 variables
success: si la consulta se ejecuto sin ningun problema
errorId: si la consulta tubo problemas retornara el valor de la columna id que se inserto en error
NOTA
a la consulta no se le indica el insert into
*/
var (success, errorId) = psql.Delete
(
"documentation.ejemplo where id = 3",
"No se pudo editar el ejemplo 3"
);
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
i
Si el aplicativo no falla en ningúna ocacion al finalizar retornara lo siguiente
Success: true
errorId: 0
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*
insert recibe 2 parametros
1. la consulta sql
2. mensaje descriptivo para error, si la consulta da error esa descripcion se insertara en la tabla de errores
insert retorna 2 variables
inserted: id de la nueva fila insertada (si da error, el id sera 0 o igualmente si la tabla no tiene un identity)
error: indicador si la consulta ha dado error
errorId: si la consulta tubo problemas retornara el valor de la columna id que se inserto en error
NOTA
a la consulta no se le indica el insert into
*/
(long inserted, bool error, long errorId) = psql.GetInserted
(
"documentation.ejemplo (nombre, edad) values ('orlando melgar', 32)",
"No se pudo insertar a orlando melgar"
);
Console.WriteLine($"ID insertado: {inserted}");
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*
insert recibe 2 parametros
1. la consulta sql
2. mensaje descriptivo para error, si la consulta da error esa descripcion se insertara en la tabla de errores
insert retorna 2 variables
success: si la consulta se ejecuto sin ningun problema
errorId: si la consulta tubo problemas retornara el valor de la columna id que se inserto en error
NOTA
a la consulta no se le indica el insert into
*/
var (success, errorId) = psql.Raw
(
@"
create table documentation.ejemplo2 (
id serial4 not null primary key,
nombre varchar(25) not null,
edad int not null,
direccion varchar(250) not null
)
",
"No se pudo crear la nueva tabla"
);
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
En este ejemplo se intentara crear una tabla desde este código en PostgreSql
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
/*instanciar la clase CtxPsql para obtener la coneccion a la bdd*/
PostgreSql psql = new CtxPsql().Psql;
/*si la coneccion no se establecio, salir del aplicativo*/
if (!psql.Success) return;
/*
exec recibe 2 parametros
1. la consulta sql
2. mensaje descriptivo para error, si la consulta da error esa descripcion se insertara en la tabla de errores
exex retorna 7 variables
list: List<IDictionary<string, object>> de los elementos seleccionados
error: variable tipo bool en el caso de error la consulta (true o false)
array: JArray de los elementos seleccionados
firstd: primer objeto seleccionado IDictionary<string, object>
firsto: primer objeto seleccionado JObject
count: indicador de cuantos elementos hay en la lista
errorId: el id de la tabla de error que se inserto si la consulta dio error
NOTA
a la consulta no se le indica el exec
*/
var (list, error, array, firstd, firsto, count, errorId) = psql.Exec
(
"documentation.exec_para_ejemplo 112",
"No se pudo crear la nueva tabla"
);
class CtxPsql
{
/*Variable PostgreSql para que se conecte a la base de datos al instanciarse la clase*/
public PostgreSql Psql;
/*instancia de la clase*/
public CtxPsql()
{
/*inicializador con las credenciales de las bases de datos*/
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
/*asignarle un valor a la coneccion*/
Psql = new(initializer);
}
}
El método Exec
emula el comportamiento del método Select
El procedimiento puede retornar ninguna a x filas, las filas se pueden leer con
la variable list y array.
Si retorna información el primer elemento se guarda en firstd o en firsto
Si la consulta/procedimiento almacenado da error entonces la variable error y errorId estarán en falso y con el numero identificador de la tabla de error que se insertó consecutivamente.
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
PostgreSql psql = new CtxPsql().Psql;
if (!psql.Success) return;
(List<string> list, bool error, long errorId) = psql.Props();
foreach (string s in list) Console.WriteLine(s);
class CtxPsql
{
public PostgreSql Psql;
public CtxPsql()
{
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
Psql = new(initializer);
}
}
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
PostgreSql psql = new CtxPsql().Psql;
if (!psql.Success) return;
(List<string> list, bool error, long errorId) = psql.Props("documentation");
foreach (string s in list) Console.WriteLine(s);
class CtxPsql
{
public PostgreSql Psql;
public CtxPsql()
{
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
Psql = new(initializer);
}
}
using Adfines.Net.Ganesha.Bdd;
using Adfines.Net.Ganesha.Xtra;
PostgreSql psql = new CtxPsql().Psql;
if (!psql.Success) return;
var props = psql.Props("documentation", "error");
foreach (var s in props.list)
{
Console.WriteLine("nombre: " + s.Name);
}
class CtxPsql
{
public PostgreSql Psql;
public CtxPsql()
{
Initializer initializer = new()
{
Ip = "localhost",
Port = 5432,
PoolSize = 10,
Bdd = "prueba2",
User = "postgres",
Password = "root",
Error = "documentation.error",
Warning = "documentation.warn"
};
Psql = new(initializer);
}
}