/// <summary> /// Obtiene un proveedor de base de datos /// </summary> private IDbProvider GetDbProvider(ConnectionModel connection) { IDbProvider provider = CacheProviders.GetProvider(connection); // Si no se ha encontrado el proveedor en el diccionario, se crea uno ... if (provider == null) { // Crea el proveedor switch (connection.Type) { case ConnectionModel.ConnectionType.Spark: provider = new SparkProvider(new SparkConnectionString(connection.Parameters.ToDictionary())); break; case ConnectionModel.ConnectionType.SqlServer: provider = new LibDbProviders.SqlServer.SqlServerProvider(new LibDbProviders.SqlServer.SqlServerConnectionString(connection.Parameters.ToDictionary())); break; case ConnectionModel.ConnectionType.Odbc: provider = new LibDbProviders.ODBC.OdbcProvider(new LibDbProviders.ODBC.OdbcConnectionString(connection.Parameters.ToDictionary())); break; default: throw new ArgumentOutOfRangeException($"Cant find provider for '{connection.Name}'"); } // Abre el proveedor provider.Open(); // Lo añade a la caché CacheProviders.Add(connection, provider); } // Devuelve el proveedor return(provider); }
/// <summary> /// Obtiene el esquema /// </summary> internal async Task <SchemaDbModel> GetSchemaAsync(SparkProvider provider, TimeSpan timeout, CancellationToken cancellationToken) { SchemaDbModel schema = new SchemaDbModel(); List <string> tables = new List <string>(); // Obtiene el esquema using (OdbcConnection connection = new OdbcConnection(provider.ConnectionString.ConnectionString)) { // Abre la conexión await connection.OpenAsync(cancellationToken); // Obtiene las tablas using (DataTable table = connection.GetSchema("Tables")) { foreach (DataRow row in table.Rows) { if (!cancellationToken.IsCancellationRequested && row.IisNull <string>("Table_Type").Equals("TABLE", StringComparison.CurrentCultureIgnoreCase)) { tables.Add(row.IisNull <string>("Table_Name")); } } } // Carga las columnas if (!cancellationToken.IsCancellationRequested) { using (DataTable table = connection.GetSchema("Columns")) { foreach (DataRow row in table.Rows) { if (!cancellationToken.IsCancellationRequested && tables.FirstOrDefault(item => item.Equals(row.IisNull <string>("Table_Name"), StringComparison.CurrentCultureIgnoreCase)) != null) { schema.Add(true, row.IisNull <string>("Table_Schem"), row.IisNull <string>("Table_Name"), row.IisNull <string>("Column_Name"), GetFieldType(row.IisNull <string>("Type_Name")), row.IisNull <string>("Type_Name"), row.IisNull <int>("Column_Size", 0), false, row.IisNull <string>("Is_Nullable").Equals("No", StringComparison.CurrentCultureIgnoreCase)); } } } } // Cierra la conexión connection.Close(); } // Devuelve el esquema return(schema); }