/// <summary> /// Carga las columnas de la vista /// </summary> private async Task LoadColumnsAsync(SqlServerProvider connection, ViewDbModel view, TimeSpan timeout, CancellationToken cancellationToken) { ParametersDbCollection parameters = new ParametersDbCollection(); string sql = @"SELECT Table_Catalog, Table_Schema, Table_Name, Column_Name FROM Information_Schema.View_Column_Usage WHERE View_Catalog = @View_Catalog AND View_Schema = @View_Schema AND View_Name = @View_Name" ; // Asigna lo parámetros parameters.Add("@View_Catalog", view.Catalog); parameters.Add("@View_Schema", view.Schema); parameters.Add("@View_Name", view.Name); // Carga las columnas using (DbDataReader reader = await connection.ExecuteReaderAsync(sql, parameters, CommandType.Text, timeout, cancellationToken)) { // Lee los registros while (!cancellationToken.IsCancellationRequested && await reader.ReadAsync(cancellationToken)) { FieldDbModel column = new FieldDbModel(); // Carga los datos de la columna column.Catalog = (string)reader.IisNull("Table_Catalog"); column.Schema = (string)reader.IisNull("Table_Schema"); column.Table = (string)reader.IisNull("Table_Name"); column.Name = (string)reader.IisNull("Column_Name"); // Añade la columna a la colección view.Fields.Add(column); } // Cierra el recordset reader.Close(); } }
/// <summary> /// Obtiene el tipo de datos de una columna /// </summary> private string GetDataType(FieldDbModel column) { string type = column.DbType; // Añade los datos if (column.Length > 0) { type += $"({column.Length})"; } // Devuelve el tipo return(type); }
/// <summary> /// Comprueba si una columna es una clave foránea /// </summary> private bool CheckIsForeignKey(TableDbModel table, FieldDbModel column) { // Recorre las restricciones comprobando si es una clave foránea foreach (ConstraintDbModel constraint in table.Constraints) { if (constraint.Type == ConstraintDbModel.ConstraintType.ForeignKey && column.Name.EqualsIgnoreCase(constraint.Column)) { return(true); } } // Si ha llegado hasta aquí es porque no es una clave foránea return(false); }
/// <summary> /// Carga las columnas de una tabla /// </summary> private async Task LoadColumnsAsync(SqlServerProvider connection, TableDbModel table, TimeSpan timeout, CancellationToken cancellationToken) { ParametersDbCollection parameters = new ParametersDbCollection(); string sql; // Añade los parámetros parameters.Add("@Table_Catalog", table.Catalog); parameters.Add("@Table_Schema", table.Schema); parameters.Add("@Table_Name", table.Name); // Crea la cadena SQL sql = @"SELECT Columns.Column_Name, Columns.Ordinal_Position, Columns.Column_Default, Columns.Is_Nullable, Columns.Data_Type, Columns.Character_Maximum_Length, CONVERT(int, Columns.Numeric_Precision) AS Numeric_Precision, CONVERT(int, Columns.Numeric_Precision_Radix) AS Numeric_Precision_Radix, CONVERT(int, Columns.Numeric_Scale) AS Numeric_Scale, CONVERT(int, Columns.DateTime_Precision) AS DateTime_Precision, Columns.Character_Set_Name, Columns.Collation_Catalog, Columns.Collation_Schema, Columns.Collation_Name, Objects.is_identity, Properties.value AS Description FROM Information_Schema.Columns AS Columns INNER JOIN sys.all_objects AS Tables ON Columns.Table_Name = Tables.name INNER JOIN sys.columns AS Objects ON Columns.Column_Name = Objects.name AND Tables.object_id = Objects.object_id LEFT JOIN sys.extended_properties AS Properties ON Objects.object_id = Properties.major_id AND Properties.minor_id = Objects.column_id AND Properties.name = 'MS_Description' WHERE Columns.Table_Catalog = @Table_Catalog AND Columns.Table_Schema = @Table_Schema AND Columns.Table_Name = @Table_Name ORDER BY Ordinal_Position" ; // Carga los datos using (DbDataReader reader = await connection.ExecuteReaderAsync(sql, parameters, CommandType.Text, timeout, cancellationToken)) { // Lee los datos while (!cancellationToken.IsCancellationRequested && await reader.ReadAsync(cancellationToken)) { FieldDbModel column = new FieldDbModel(); // Asigna los datos del registro column.Name = (string)reader.IisNull("Column_Name") as string; column.OrdinalPosition = (int)reader.IisNull("Ordinal_Position", 0); column.Default = (string)reader.IisNull("Column_Default"); column.IsRequired = ((string)reader.IisNull("Is_Nullable")).Equals("no", StringComparison.CurrentCultureIgnoreCase); column.DbType = (string)reader.IisNull("Data_Type"); column.Length = (int)reader.IisNull("Character_Maximum_Length", 0); column.NumericPrecision = (int)reader.IisNull("Numeric_Precision", 0); column.NumericPrecisionRadix = (int)reader.IisNull("Numeric_Precision_Radix", 0); column.NumericScale = (int)reader.IisNull("Numeric_Scale", 0); column.DateTimePrecision = (int)reader.IisNull("DateTime_Precision", 0); column.CharacterSetName = (string)reader.IisNull("Character_Set_Name"); column.CollationCatalog = (string)reader.IisNull("Collation_Catalog"); column.CollationSchema = (string)reader.IisNull("Collation_Schema"); column.CollationName = (string)reader.IisNull("Collation_Name"); column.IsIdentity = (bool)reader.IisNull("is_identity"); column.Description = (string)reader.IisNull("Description") as string; // Añade la columna a la colección table.Fields.Add(column); } // Cierra el recordset reader.Close(); } }