/// <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> /// Carga las restricciones de una tabla /// </summary> private async Task LoadConstraintsAsync(SqlServerProvider connection, TableDbModel table, TimeSpan timeout, CancellationToken cancellationToken) { ParametersDbCollection parameters = new ParametersDbCollection(); string sql = @"SELECT TableConstraints.Table_Catalog, TableConstraints.Table_Schema, TableConstraints.Table_Name, ColumnConstraint.Column_Name, ColumnConstraint.Constraint_Name, TableConstraints.Constraint_Type, Key_Column.Ordinal_Position FROM Information_Schema.Table_Constraints AS TableConstraints INNER JOIN Information_Schema.Constraint_Column_Usage AS ColumnConstraint ON TableConstraints.Constraint_Catalog = ColumnConstraint.Constraint_Catalog AND TableConstraints.Constraint_Schema = ColumnConstraint.Constraint_Schema AND TableConstraints.Constraint_Name = ColumnConstraint.Constraint_Name INNER JOIN Information_Schema.Key_Column_Usage AS Key_Column ON ColumnConstraint.Constraint_Catalog = Key_Column.Constraint_Catalog AND ColumnConstraint.Constraint_Schema = Key_Column.Constraint_Schema AND ColumnConstraint.Constraint_Name = Key_Column.Constraint_Name AND ColumnConstraint.Column_Name = Key_Column.Column_Name WHERE TableConstraints.Table_Catalog = @Table_Catalog AND TableConstraints.Table_Schema = @Table_Schema AND TableConstraints.Table_Name = @Table_Name ORDER BY TableConstraints.Table_Name, TableConstraints.Constraint_Type, Key_Column.Ordinal_Position" ; // Añade los parámetros parameters.Add("@Table_Catalog", table.Catalog); parameters.Add("@Table_Schema", table.Schema); parameters.Add("@Table_Name", table.Name); // 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)) { ConstraintDbModel constraint = new ConstraintDbModel(); // Asigna los datos del registro constraint.Catalog = (string)reader.IisNull("Table_Catalog"); constraint.Schema = (string)reader.IisNull("Table_Schema"); constraint.Table = (string)reader.IisNull("Table_Name"); constraint.Column = (string)reader.IisNull("Column_Name"); constraint.Name = (string)reader.IisNull("Constraint_Name"); constraint.Type = GetConstratype((string)reader.IisNull("Constraint_Type")); constraint.Position = (int)reader.IisNull("Ordinal_Position"); // Añade la restricción a la colección table.Constraints.Add(constraint); } // Cierra el recordset reader.Close(); } }
/// <summary> /// Normaliza la SQL que se va a enviar a Spark cambiando los parámetros especificados /// Obtiene los parámetros de base de datos buscando en la cadena SQL las cadenas: @xxxx (@ es el prefijo del argumento de consulta) /// Añade un parámetro a la colección cada vez que se encuentre un nombre de variable /// Se hace así porque OleDb y ODBC no admiten parámetros por nombre si no que sustituye los nombres /// de parámetros por posición (utilizando el marcador ?) /// </summary> public (string sql, ParametersDbCollection parametersDb) NormalizeSql(string sql, ParametersDbCollection inputParametersDb, string parameterPrefix) { ParametersDbCollection ouputParametersDb = new ParametersDbCollection(); string sqlOutput = string.Empty; System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(sql, "\\" + parameterPrefix + "\\w*", System.Text.RegularExpressions.RegexOptions.IgnoreCase, TimeSpan.FromSeconds(1)); int lastIndex = 0; // Mientras haya una coincidencia while (match.Success) { // Añade lo anterior del SQL a la cadena de salida y cambia el índice de último elemento encontrado sqlOutput += sql.Substring(lastIndex, match.Index - lastIndex); lastIndex = match.Index + match.Length; // Añade el marcador de parámetro sqlOutput += "? "; // Añade el parámetro a la colección de parámetros necesarios ouputParametersDb.Add(GetParameterValue(parameterPrefix, sql.Substring(match.Index, match.Length), inputParametersDb, ouputParametersDb.Count)); // Pasa a la siguiente coincidencia match = match.NextMatch(); } // Añade el resto de la cadena inicial if (lastIndex < sql.Length) { sqlOutput += sql.Substring(lastIndex); } // Devuelve la colección de parámetros para la base de datos return(sqlOutput, ouputParametersDb); }
/// <summary> /// Obtiene una colección de parámetros con un único parámetro de tipo entero /// </summary> private ParametersDbCollection GetParameters(string Parameter, int?parameterValue) { ParametersDbCollection parametersDB = new ParametersDbCollection(); // Asigna los parámetros parametersDB.Add(Parameter, parameterValue); // Devuelve los parámetros return(parametersDB); }
/// <summary> /// Carga un objeto utilizando genéricos para un procedimiento con un único parámetro alfanumérico /// </summary> public TypeData LoadObject(string text, string Parameter, string parameterValue, int parameterLength, CommandType commandType, AssignDataCallBack callBack) { ParametersDbCollection parametersDB = new ParametersDbCollection(); // Asigna los parámetros parametersDB.Add(Parameter, parameterValue, parameterLength); // Carga los datos return(LoadObject(text, parametersDB, commandType, callBack)); }
/// <summary> /// Crea la lista de parámetros a pasar a la consulta /// </summary> private ParametersDbCollection ConvertParameters(IDbProvider provider, NormalizedDictionary <object> parameters) { ParametersDbCollection parametersDb = new ParametersDbCollection(); // Convierte los parámetros foreach ((string key, object value) in parameters.Enumerate()) { parametersDb.Add($"{provider.SqlHelper.ParameterPrefix}{key}", value); } // Devuelve la colección de parámetros para la base de datos return(parametersDb); }
//? Está comentado porque Spark SQL no admite las cadenas ODBC con marcadores de parámetros, por eso se utiliza la rutina anterior ///// <summary> ///// Ejecuta una serie de comandos utilizando parámetros de base de datos ///// </summary> //private int ExecuteCommands(List<string> commands, NormalizedDictionary<object> parameters, TimeSpan timeOut) //{ // int scriptsExecuted = 0; // SparkSqlTools sqlTools = new SparkSqlTools(); // ParametersDbCollection parametersDb = ConvertParameters(parameters); // // Ejecuta los comandos // using (SparkProvider provider = new SparkProvider(new SparkConnectionString(Manager.Connection.ConnectionString))) // { // // Abre la conexión // provider.Open(); // // Ejecuta las consultas // foreach (string command in commands) // { // (string sqlNormalized, ParametersDbCollection parameterNormalizedDb) = sqlTools.NormalizeSql(command, parametersDb, "$"); // // Ejecuta la cadena SQL // provider.Execute(sqlNormalized, parameterNormalizedDb, System.Data.CommandType.Text, timeOut); // // Indica que se ha ejecutado una sentencia // scriptsExecuted++; // } // } // // Devuelve el número de comandos ejecutados // return scriptsExecuted; //} /// <summary> /// Crea la lista de parámetros a pasar a la consulta /// </summary> private ParametersDbCollection ConvertParameters(NormalizedDictionary <object> parameters) { ParametersDbCollection parametersDb = new ParametersDbCollection(); // Convierte los parámetros foreach ((string key, object value) in parameters.Enumerate()) { parametersDb.Add("$" + key, value); } // Devuelve la colección de parámetros para la base de datos return(parametersDb); }
/// <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(); } }