/// <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);
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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));
        }
Exemplo n.º 6
0
        /// <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();
            }
        }