Unofficial Content

.NET Data Provider For GeneXus

Introducción

GeneXus publica información de una base de conocimiento (KB) desde su versión 7.0 a través de GXPublic, un OleDB provider que permite acceder a los metadatos (tablas, atributos, objetos, etc.) de una KB.

GXPublic se ha mantenido como método de acceso a la metadata de una KB hasta la versión 9.0 de GeneXus. En GeneXus Rocha ya no existe GXPublic, la forma de acceder a la metadata es a través de la Business Logic de GeneXus (BL de ahora en mas).

La BL de GeneXus Rocha es un conjunto de librerías que entre otras cosas permiten acceder a la metadata de una KB. Sin bien esta BL es extramadamente potente (de hecho el Development Environment de GeneXus Rocha usa los servicios de la BL), el uso de la misma tiene una complejidad no menor que es conocer el modelo de objetos de esta BL (clases, métodos, propiedades, etc.) que es bastante mas grande que el conjunto de tablas relaciones que se publican con GXPublic hasta la versión 90 de GeneXus.

De lo anterior surge la motivación para desarrollar un .NET Data Provider For GeneXus que para definirlo de forma sencilla en base a tecnologías ya conocidas:

  • Para quienes ya conocen GXPublic, pueden ver al .Net Data Provider For GeneXus como Data Provider análogo a GXPublic solo que el driver en vez de cumplir con la especificación OleDB Provider cumple con la especificación .Net Data Provider
  • Para quienes han programado una capa de acceso a datos en lenguaje .NET, es un .NET Data Provider más, solo que en vez de acceder a Oracle (.NET Data Provider for Oracle) o MySQL (.NET Data Provider for MySQL) o SQL Server, etc. fue desarrollado para acceder a una KB GeneXus Rocha.

Implementación

Formalmente un .NET Data Provider es un driver de acceso a datos, es decir el componente de software que interactúa entre la aplicación y los datos (ya sea una base de datos, un archivo de texto, un directorio LDAP, una KB, etc.). Para poder llamarse .NET Data Provider debe cumplir con una especificación de ADO.NET que viene dada por la implementación de las siguientes interfases: IDbConnection, IDbCommand, IDbDataAdapter, IDataReader del namespace System.Data del .NET Framework.

.NET Data Provider for GeneXus implementa estas interfaces a través de las clases GXConnection, GXCommand, GXDataAdapter (Para la interfaz IDataReader no se implementó una clase sino que en este caso se usa la ya existente DataTableReader que es una clase de System.Data que implementa la interfaz IDataReader).

A través de esta versión del provider se pueden ejecutar consultas SELECT de la forma:

SELECT AttId, AttType FROM Attribute WHERE MdlId = 2 AND AttName = "CliCod"

o de la forma

SELECT * FROM Attribute WHERE MdlId = 2 AND AttName = "CliCod"

No se soportan:

  • Las cláusulas GROUP BY, ORDER, HAVING y en el WHERE no se soportan los operadores OR, LIKE,..(solo se soporta AND)
  • Joins
  • Sentencias de modificación de datos (UPDATE, DELETE, INSERT)
  • Tampoco se soportan comandos que estaban disponibles en GXPublic, como ser distribuir, consolidar o especificar. Para esto en GeneXus Rocha existe una herramienta mucho más potente e igualmente fácil de usar, que es MS Build Tasks.
  • Es importante respetar el uso de mayúsculas y minúsculas en los nombres de tablas y atributos. No se garantiza que en todos los casos se soporten variantes.
Los tipos de datos de las columnas pueden ser:
  • Int32: valores enteros, por ejemplo 0, 1, 2, etc.
  • String: cadenas de caracteres por ejemplo "Design", "CustomerName", etc. Deben estar siempre entre comillas dobles.
  • DateTime: fechas con formato AAAA-MM-DDThh:mm:ss, como por ejemplo 2007-07-26T18:34:27.

Instalación y requerimientos

En esta versión no hay un setup para instalar el driver.

Para utilizarlo, es necesario obtener el proyecto de Visual Studio desde GXOpen, y agregar un nuevo proyecto a la solución.

Directorio lib

Para que el driver funcione correctamente, es necesario copiar algunos archivos de configuración y bibliotecas de GeneXus Rocha. Con este fin, se creo un directorio \lib, donde se deben copiar estos archivos.

También se cuenta con un script localizado en \scripts\UpdateLibFiles.bat, que copia los archivos desde el directorio de instalación de GeneXus al directorio \lib. Si la instalación de GeneXus no se realizó en el directorio por defecto, será necesario modificar este archivo para que busque los archivos a copiar en el directorio correcto.

Propiedades del proyecto

En las propiedades del proyecto, en la sección "Build events", en el campo de texto "Pre-build event command line", se debe pegar lo siguiente:

cd /D $(SolutionDir)
cd ..
xcopy Lib\*.dll $(TargetDir) /Y /D
xcopy Lib\*.dll $(TargetDir)\Packages /Y /D
xcopy Lib\genexus.exe.config $(TargetDir) /Y /D
xcopy Lib\ModelConstants.xml $(TargetDir) /Y /D
xcopy Lib\Definitions\*.* $(TargetDir)Definitions\ /Y /D

Esto actualiza las bibliotecas de GeneXus Rocha en el proyecto, así como también copia archivos de configuración necesarios.

Variable de ambiente

El proyecto también necesita que se configure la variable de ambiente GXPackagesDir, apuntando al directorio de paquetes de GeneXus Rocha. Por defecto este directorio es C:\Program Files\ARTech\GeneXus\Rocha\Packages, aunque puede ser distinto si la instalación no se hizo en el directorio por defecto o el sistema operativo está en otro idioma.

Para crear la variable de ambiente, se puede utilizar el siguiente comando:

set GXPackagesDir=C:\Program Files\ARTech\GeneXus\Rocha\Packages

Es importante tener este directorio configurado, o de lo contrario la información que devuelva el data provider podría ser incompleta.

Ejemplos de uso

A continuación se lista el código fuente de algunos ejemplos típicos de uso. Quienes ya hallan programado con ADO.NET notarán que la sintáxis es análoga a la de cualquier otro .net  provider.

GXCommand

  DataAdapter string connectionString = "c:\\kbs\\sampleRochaKB";
 GXConnection gxConnection1 = new GXConnection(connectionString);
 string cmdText = "select * from Object where MdlId = 1";
 GXCommand cmd = new GXCommand(cmdText, gxconnection);
 cmd.CommandType = CommandType.Text;
 IDataReader reader = cmd.ExecuteReader();
 while (reader.Read())
 {
  int mdlId = (int) reader"MdlId";
  string objName = reader"ObjNam".ToString();
  Console.WriteLine(String.Format("MdlId = {0}; ObjNam = {1}", mdlId, objName));
 }
 reader.Close();

GXDataAdapter

private static void FillDataAdapterUsingCommand(GXConnection gxconnection)
{
 string cmdText = "select * from Model";
 GXCommand cmd = new GXCommand(cmdText, gxconnection);
 cmd.CommandType = CommandType.Text;
 GXDataAdapter da = new GXDataAdapter();
 da.SelectCommand = cmd;
 DataSet ds = new DataSet();
 da.Fill(ds);    /* Connect KB, execute SELECT, Disconnect from KB*/
 DataTable dt = ds.Tables0;
 Console.WriteLine("Table:" + dt.TableName);
 Console.WriteLine("");

 // List columns
 Console.WriteLine("Columns");
 foreach (DataColumn c in dt.Columns)
 {
  Console.WriteLine("Name:" + c.ColumnName + " Type:" + c.DataType.Name );
 }

 // List Primary Key
 Console.WriteLine("Primary Key Columns");
 foreach (DataColumn c in dt.PrimaryKey)
 {
  Console.WriteLine("Name:" + c.ColumnName);
 }

 Console.WriteLine("");
 Console.WriteLine("Table Rows");

 // List rows accessing columns by row position
 foreach (DataRow r in dt.Rows)
 {
  Console.WriteLine("Id:" + r0.ToString() + " Name:" + r1.ToString());
 }
 // List rows accessing columns by name
 foreach (DataRow r in dt.Rows)
 {
  string sRow = "";
  foreach (DataColumn c in dt.Columns)
  {
   sRow = sRow + " " + c.ColumnName + "=" + rc.ColumnName;   
  }
  Console.WriteLine(sRow);
  
 }

Información Publicada 

La información publicada por el .Net Data Provider mantiene el esquema de datos definido por GXPublic de forma que sea más sencillo migrar aplicaciones que usaban dicha tecnología.

Sin embargo, muchas veces la información publicada en GXPublic para versiones anteriores no se encuentra disponible para GeneXus Rocha. En esos casos, se mantiene de todas formas la columna por compatibilidad pero no se devuelve un valor válido.

Además de la información publicada por GXPublic, se agregó en algunas tablas información redundante proveniente de otras tablas, ya que esta herramienta no permite hacer joins entre tablas. Así por ejemplo, en la tabla Object se agregó como redundante el nombre del modelo (MdlNam) para poder incluirlo en las consultas. Lo mismo se hizo para las demás tablas en los casos que se consideró oportuno, la explicación de cada uno de estos campos aparece en la tabla correspondiente. En ningún caso, estos campos redundantes se listarán en el caso que se realice una consulta de tipo "select * from tabla where condiciones".

A continuación se lista el conjunto de tablas que están disponibles en esta versión del .Net Data Provider.

Tabla: Model

Información de los modelos de la base de conocimiento.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
MdlNam Nombre
String

MdlPath Ruta del directorio del modelo
String

MdlReorgTS Fecha y hora de la última reorganización
DateTime
No soportado, devuelve siempre 1/1/1900
MdlAttLen
Largo de los nombres de atributos
Int32
No soportado, devuelve siempre 30
MdlTblLen Largo de los nombres de tablas
Int32
No soportado, devuelve siempre 30
MdlObjLen Largo de los nombres de objetos
Int32
No soportado, devuelve siempre 30
MdlUpdTS Fecha y hora de la última modificación en el modelo
DateTime

MdlTblUpdTS Fecha y hora de la última tabla modificada
DateTime No soportado, devuelve siempre 1/1/1900

Tabla: Object

Información de los objetos de la base de conocimiento.

Importante: En GXPublic la clave de esta tabla era {MdlId, ObjCls, ObjId}. En GeneXus Rocha, es posible crear nuevos tipos de objetos utilizando las Extensions SDK, y cada tipo de objeto se identifica por un GUID y no por un valor entero. Por lo tanto, la clave de esta tabla en la implementación del .Net Data Provider pasa a ser {MdlId, ObjClsGUID, ObjId}. Por compatibilidad se mantiene el atributo ObjCls como atributo secundario, y se devuelve un valor válido para los tipos de datos conocidos.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
ObjClsGUID GUID de la clase del objeto
String
PK; nuevo
ObjId
Identificador del objeto
String
PK
ObjCls
Clase del objeto
Int32
Enumerado (ver más abajo)
ObjNam Nombre del objeto
String

ObjOwner
Id de la carpeta donde se encuentra el objeto
Int32

ObjDsc
Descripción del objeto
String

ObjTyp Tipo del objeto (data warehouse)
Int32
No soportado, devuelve siempre 0
ObjMainGen Generador asociado al objeto
Int32
No soportado, devuelve siempre 0
ObjCreTS Fecha y hora de creación del objeto
DateTime
No soportado, devuelve siempre 1/1/1900
ObjUpdTS Fecha y hora de modificación del objeto
DateTime

ObjSpcTS Fecha y hora de especificación del objeto
DateTime
No soportado, devuelve siempre 1/1/1900
ObjSty Style asociado al objeto
Int32
No soportado, devuelve siempre 0
ObjTblAssc Tabla asociada al objeto
Int32
No soportado, devuelve siempre 0
ObjConsTS Fecha y hora de consolidación del objeto
DateTime
No soportado, devuelve siempre 1/1/1900
MdlNam
Nombre del modelo
String
Nuevo; información redundante
ObjClsName
Nombre de la clase del objeto
String
Nuevo; información redundante

Los valores posibles para ObjCls son los siguientes:
  • 0: transaction
  • 1: procedure
  • 2: report
  • 3: menu
  • 4: work panel
  • 5: attribute
  • 6: data view
  • 7: table
  • 8: folder
  • 9: model
  • 10: group
  • 11: domain
  • 12: prompt
  • 13: web panel
  • 14: external program
  • 17: menu bar
  • 18: transaction style
  • 19: procedure style
  • 20: report style
  • 21: work panel style
  • 22: prompt style
  • 23: web panel style
  • 24: menu bar style
  • 25: theme
  • 26: structured data type
  • 28: language
  • 29: category (nuevo, no disponible en versiones anteriores a GeneXus Rocha)
  • 30: index (nuevo, no disponible en versiones anteriores a GeneXus Rocha)
  • 31: pattern settings (nuevo, no disponible en versiones anteriores a GeneXus Rocha)
  • 32: master page (nuevo, no disponible en versiones anteriores a GeneXus Rocha)
  • 33: web component (nuevo, no disponible en versiones anteriores a GeneXus Rocha)
  • 34: image (nuevo, no disponible en versiones anteriores a GeneXus Rocha)
  • -1: tipo de datos desconocido al momento de implementar el .Net Data Provider

Tabla: Attribute

Información de los atributos de la base de conocimiento.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
AttId Identificador del atributo
Int32
PK
AttNam
Nombre del atributo
String

AttDsc Descripción del atributo
String

AttTyp Tipo del atributo
Int32
Enumerado (ver más abajo)
AttCls
Clase del atributo
Int32
Enumerado (ver más abajo); por ahora devuelve siempre cero
AttLen Largo del atributo
Int32

AttDec
Cantidad de decimales
Int32

AttRng
Rango de valores
String
No soportado, devuelve siempre vacío
AttSign
Signo
Int32

AttPic
Picture del atributo
String
No soportado, devuelve siempre vacío
AttDom Id del dominio asociado, 0 si no tiene dominio
Int32

AttIdSup
Supertipo, 0 si no tiene
Int32

AttUpdTS Fecha y hora de modificado
DateTime

AttFrml
Fórmula
String

AttDomName
Nombre del dominio asociado al atributo
String
Nuevo; información redundante
AttSupName
Nombre del supertipo asociado al atributo
String
Nuevo; información redundante
AttDataType
Tipo de datos del atributo, como lo muestra GX, por ejemplo N(13,2)-
String
Nuevo; por el momento casi siempre devuelve blanco

Los valores posibles para AttTyp son:
  • 4: INT
  • 5: CHARACTER
  • 6: DATE
  • 8: LONGVARCHAR
  • 12: DATETIME
  • 13: VARCHAR
  • 14: BLOB (no soportado)
  • 15: BINARY (no disponible en GXPublic)
  • 16: BITMAP (no disponible en GXPublic)
  • 17: BOOLEAN (no disponible en GXPublic)
  • 18: NUMERIC (no disponible en GXPublic)

Los valores posibles para AttCls son:
  • 1: Clave primaria
  • 2: Atributo secundario
  • 3: Inferido
  • 4: Fórmula vertical
  • 5: Fórmula horizontal

Tabla: Table

Información de las tablas de la base de conocimiento.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
TblId
Identificador de la tabla
Int32
PK
TblNam
Nombre de la tabla
String

TblDsc
Descripción de la tabla
String

Tabla: Index

Información de los índices de la base de conocimiento.

Importante: Al igual que para la tabla Object, se sustituye el atributo ObjCls por el atributo ObjClsGUID en la clave primaria.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
ObjClsGUID
GUID de la clase del objeto String
PK; nuevo
ObjId
Identificador del objeto
Int32
PK
IdxId
Identificador del índice
Int32
PK
ObjCls
Clase de objeto
Int32
Enumerado, ver lista de valores posibles en tabla Object
IdxNam
Nombre del índice
String

IdxTyp
Tipo del índice
Int32
Enumerado (1=Unique, 2=Duplicate)
IdxSrc
Índice de usuario o del sistema
Int32
No soportado, devuelve siempre cero

Tabla: IdxAtt

Información de los atributos de los índices de la base de conocimiento.

Importante: Al igual que para la tabla Object, se sustituye el atributo ObjCls por el atributo ObjClsGUID en la clave primaria.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
ObjClsGUID
GUID de la clase del objeto String
PK; nuevo
ObjId
Identificador del objeto
Int32
PK
IdxId
Identificador del índice
Int32
PK
IdxPos
Posición del atributo en el índice
Int32
PK
ObjCls
Clase de objeto
Int32
Enumerado, ver lista de valores posibles en tabla Object
AttId
Identificador del atributo
Int32

IdxOrder
Orden
Int32
Enumerado (1=Ascendente, 0=Descendente)
AttNam
Nombre del atributo
String
Nuevo; información redundante

Tabla: TrnStructure

Información de la estructura de las transacciones de la base de conocimiento.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
TrnId
Identificador de la transacción
Int32
PK
TrnLvlId
Nivel
Int32
PK
TrnItmTyp
Tipo de elemento
Int32
PK; enumerado (0=Nivel, 1=Atributo)
TrnItmId
Identificador del atributo o del nivel (según indique TrnItmTyp)
Int32

TrnItmIskey
Indica si el atributo es clave primaria en el nivel
Int32
Enumerado (0=Es clave, 1=No es clave)
TrnItmNam
Nombre del atributo o del nivel (según indique TrnItmTyp) String
Nuevo; información redundante

Tabla: TblAtt

Información de los atributos de las tablas de la base de conocimiento.

Columna
Descripción
Tipo de datos
Observaciones
MdlId
Identificador del modelo
Int32
PK
TblId
Identificador de la tabla
Int32
PK
AttId
Identificador del atributo
Int32
PK
TblAttIsKey
Indica si el atributo es clave primaria en la tabla
Int32
1=Es clave primaria; 0=No es clave primaria
TblAttRed
Indica si el atributo es redudante
Int32
1=Es redundante; 0=No es redundante
TblAttStd
Stored
Int32
No soportado, devuelve siempre cero
TblAttAllowNulls
Indica si el atributo acepta nulos
Int32
1=Acepta nulos; 0=No acepta nulos
TblNam
Nombre de la tabla
String
Nuevo; información redundante
AttNam
Nombre del atributo
String
Nuevo; información redundante

Tabla: Variables

Información de las variables de un objeto de la base de conocimiento.

Nota: Aún no implementado

Tabla: Domain

Información de los dominios de la base de conocimiento.

Nota: Aún no implementado

Tabla: CrossRef

Información de las referencias entre objetos de la base de conocimiento.

Nota: Aún no implementado

Tablas no soportadas en esta versión

Se decidió no implementar un conjunto de tablas en esta versión, porque se prefirió dedicar el esfuerzo a tablas que son usadas más frecuentemente en las aplicaciones que consultan la información de una KB.

Las tablas que se encontraban en GXPublic y que no están disponibles en esta versión del .Net Data Provider son:
  • AttProp
  • DomProp
  • DVAtt
  • DVIdxPlat
  • DVPlat
  • FormClass
  • Formula
  • Generator
  • Group
  • GrpAtt
  • KBProp
  • Message
  • MStyle
  • ObjForm
  • ObjProp
  • ObjSource
  • Property
  • TblExtended
  • TblSubBy
  • TblSubor
  • Translation
  • TrnLvl
Last update: April 2024 | © GeneXus. All rights reserved. GeneXus Powered by Globant