# API de acceso a datos de Devkron desde C Sharp Si va a consultar o manipular datos de los sistemas R5 o V12 a través de programas en C#, se recomienda usar la API de Devkron que es con la que estas bases de datos son manipuladas por los productos de Induxsoft. Ahora bien, si requiere ejecutar procesos mediante programas de línea de comando que puedan programarse como tareas (crons), servicios Web o páginas Web, puede resultar mucho más sencillo programar en Devkron que en C#. No obstante, si C# es su única opción siga las siguientes indicaciones: Debe hacer referencia a los siguientes ensamblados: * induxsoft.DMA.dll Es el modelo de acceso a datos relacionales * induxsoft_Connections.dll Permite establecer conexiones con las configuraciones almacenadas en el administrador de conexiones * induxsoft.API.DB.dll La API de alto nivel de acceso a datos Si va a crear un programa para la plataforma .Net Framework 4.5 o superior, deberá hacer referencia a los ensamblados que se encuentran en ```%programdata%\induxsoft\machine\winshell\v10``` (deberá instalar Devkron Core for Windows Desktop con IWA), si el destino será .Net 5 (Linux/Win) deberá hacer referencia a los ensamblados en la carpeta de binarios de Devkron [https://devkron.org](https://devkron.org) Para comprender mejor los conceptos asociados al acceso a bases de datos relacionales lea la documentación de Devkron en: [https://docs.induxsoft.net/es/devkron/Bibliotecas-de-funciones/dbr/dbr.md](https://docs.induxsoft.net/es/devkron/Bibliotecas-de-funciones/dbr/dbr.md) aunque las funciones documentadas corresponden al ensamblado Devkron.DBR.dll que es la biblioteca subyacente de la API de Devkron, los conceptos inherentes al administrador de conexiones y los patrones de diseño de tablas son útiles y válidos. Use el Administrador de conexiones provisto con Devkron para gestionar esta información a través de una interfaz de usuario o las funciones de esta biblioteca. El siguiente código en C# puede servirle de guía: ``` cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace db_example { class Program { static void Main(string[] args) { // Indicar que el Hash MD5 corresponde a los bytes UNICODE de la contraseña // Esto es requerido para bases de datos de sistemas R5 induxsoft.API.DB.Devkron.UseHashMD5Unicode = true; // Crear una instancia de la clase Devkron (descendiente de database) // para conectarse a la base de datos indicada con el nombre de usuario y contraseña especificados induxsoft.API.DB.Devkron db = new induxsoft.API.DB.Devkron("mi_empresa@maxicomercio.r5", "admin","12345"); Console.WriteLine("Conectado"); //// Transacciones //// // db.BeginTrans(); // Inicia una transacción // db.RollBack(); // Deshacer una transacción // db.Commit(); // Confirma una transacción //// Especificar parámetros para las consultas //var p = new induxsoft.API.DB.Record("pk_cliente", 1); // Una colección de parámetros inicializada con 1 parámetro //p["pk_tipo"] = 1; // Asignación de un parámetro //p["id"] = 3; //p["otro_parametro"] = "algún valor"; // Otro parámetro en la colección //// Consultar datos //// Obtener una fila como un registro //var rec=db.GetRecord("select * from cliente where sys_pk=@pk_cliente", p); //// Obtener varias filas como una lista de objetos //var l=db.GetList("select * from tipocliente", null); //// Obtener varias filas como un DataTable //var t = db.GetTable("select * from tipocliente", null); //// Obtener el valor de la primera fila y primera columna //var v=db.GetScalar("select saldo from cliente where sys_pk=@pk_cliente", p); //// Insertar una fila //var data = new induxsoft.API.DB.Record("id", 1000); //data["const"] = "Nuevo tipo de documento"; //db.Insert("cdocumentos", data); //// Actualizar una fila //data["const"] = "Modificado el nuevo tipo"; //db.Update("cdocumentos", data, "id=@id", data); //// Eliminar una fila //db.Delete("tipocliente", "sys_pk=@pk_tipo", p); //// Agregar o actualizar una entidad de R5/V12 //var entity = new induxsoft.API.DB.Record(); //entity["sys_pk"] = 1; // Como se indica una clave primaria se hará una actualización //entity["descripcion"] = "Tipo de cliente modificado"; //db.Save("tipocliente", entity); } } } ``` ## ¿Cómo se comprueba la contraseña del usuario? La tabla ```tuser``` contiene los campos: * userid. Es el Id de cada usuario * pwd. Es la firma MD5 de los bytes UNICODE de la cadena de constraseña * pwdmd5. Es la firma MD5 de los bytes UTF-8 de la cadena de la contraseña Las aplicaciones R5 usan las contraseñas en UNICODE, por lo que deberá generar la firma MD5 de los bytes UNICODE y compararla contra el campo pwd, los sistemas V12 pueden optar por la firma de UTF-8, pero por compatibilidad de manera predeterminada se comportan como los R5 El siguiente método permite obtener la firma MD5 en UNICODE de una contraseña que puede comparar directamente con el valor en el campo ```pwd```: ``` cs public static string MD5Unicode(string pwd) { MD5 md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create(); Encoding encoding = new System.Text.UnicodeEncoding(); byte[] stream = null; StringBuilder sb = new StringBuilder(); stream = md5.ComputeHash(encoding.GetBytes(pwd)); for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]); return sb.ToString().ToUpper(); } ``` ## Campos de control Vea el patrón de diseño de las tablas en: [https://docs.induxsoft.net/es/devkron/Bibliotecas-de-funciones/dbr/dbr.md](https://docs.induxsoft.net/es/devkron/Bibliotecas-de-funciones/dbr/dbr.md) Importante: Si una tabla implementa el patrón de diseño de entidades de Devkron (y tiene el campo ```sys_recver```), y modifica una fila sin usar el método ```Save``` por favor increméntelo en 1 después de actualizar datos, así como establezca ```sys_timestamp``` a la fecha y hora del servidor al momento.