private String GetValueObject(Column oColumn, Object sValue) { if (sValue == null) { if (!oColumn.IsNull) sValue = "NULL"; else if (!String.IsNullOrEmpty(oColumn.DefaultData)) sValue = oColumn.DefaultData; else //todo:MEJORA. Quitar las exception y sustituir por una clase de negocio. throw new ArgumentException("El campo " + oColumn.NameColumn + "No puede ser nulo", ToString()); } else sValue = TypeData(oColumn, sValue.ToString()); return sValue.ToString(); }
/// <summary> /// Devuelve el valor del campo con su valor correspondiente formateado. /// </summary> /// <param name="oColumn">Objeto ClsColumn, contiene toda la información sobre la columna de la tabla</param> /// <param name="sValue">Valor para el campo</param> /// <returns>Devuelve el valor formateado.</returns> private String TypeData(Column oColumn, String sValue) { String sComilla = ""; switch (oColumn.DataType) { case "int4": case "int8": case "int2": if (ClsGeneral.IsNumeric(sValue)) //si viene con decimales se los quita sValue = int.Parse(sValue).ToString(); else if (sValue.ToUpper() == "NULL") //no hace nada (se supone que el campo admite valores NULL) break; else sValue = "0"; break; case "varchar": case "text": if (!String.IsNullOrEmpty(sValue)) { //todo:MEJORA. Quitar las exception y sustituir por una clase de negocio. if (sValue.Length > oColumn.FieldLenght) throw new ArgumentException( "El valor del campo " + oColumn.NameColumn + " ha superado la longuitud.", ToString()); sComilla = "'"; } else sValue = "NULL"; break; //timestamp, es como para utilizar un identificador o para marcar la versión de actualización de la Columna. //Si voy a trabajar con fechas mejor utilizar campos Date o DataTime. //Pienso que los campos TimesTamp, se deberían usar para la auditoría. case "timestamp": case "date": case "timetz": if (ClsGeneral.IsDate(sValue)) { sComilla = "'"; //ISO 8601. Formato de las fecha utilizado por la base de datos Postgres. sValue = DateTime.Parse(sValue).ToString("yyyy-MM-dd hh:mm:ss"); } else sValue = "NULL"; break; case "bool": if (String.IsNullOrEmpty(sValue)) sValue = "NULL"; else sValue = sValue.ToUpper(); break; //Todo. Mirar como se comportan los campos númericos, para devolver una excepcion. En el caso //de exceder de la longuitud máxima. case "float8": case "numeric": if (ClsGeneral.IsNumeric(sValue)) //convierte la coma en punto sValue = sValue.Replace(",", "."); else if (sValue.ToUpper() == "NULL") //no hace nada (se supone que el campo admite valores NULL) break; else sValue = "0"; break; } return sComilla + sValue + sComilla; }
/// <summary> /// Carga la estructura de una tabla(Columnas). /// </summary> /// <param name="sNombreTable">Nombre de la tabla.</param> /// <returns>Devuelve un objeto del tipo ClsTable.</returns> private Table LoadTable(String sNombreTable) { var oTable = new Table(_nameTable, new List<string>(), new List<Column>()); DataTable dtTable; try { dtTable = _conection.DbConnection.GetSchema("Columns", new[] {null, null, sNombreTable, null}); //Recorremos todos los registros, para obtener las propiedades de cada una de las columnas de la tabla. foreach (DataRow row in dtTable.Rows) { using (var oColumn = new Column()) { //recorre cada propiedad del campo foreach (DataColumn col in dtTable.Columns) { switch (col.ColumnName.ToUpper()) { case "DATA_TYPE": //Tipo de datos oColumn.DataType = row[col].ToString(); break; case "CHARACTER_MAXIMUM_LENGTH": //Longitud del campo oColumn.FieldLenght = (row[col].ToString() == "") ? 0 : int.Parse(row[col].ToString()); break; case "IS_NULLABLE": //Permite valores nulos oColumn.IsNull = (row[col].ToString() == "YES"); break; case "COLUMN_DEFAULT": //Valor por defecto oColumn.DefaultData = (row[col].ToString() == "") ? "Null" : row[col].ToString(); break; case "COLUMN_NAME": //Nombre del campo oColumn.NameColumn = row[col].ToString(); break; } } oTable.ColColums.Add(oColumn); } } LoadPrimaryKey(oTable); } catch (Exception ex) { ClsTraccer.RunException(ex, "Error al inicializar el esquema de la tabla " + _nameTable, "LoadTable overloads1"); } return oTable; }