Neste artigo, abordaremos como carregar dados do PIB (Produto Interno Bruto) de vários países em um banco de dados SQL utilizando C#. O objetivo é criar um aplicativo que se conecte a uma API do Banco Mundial, recupere os dados e os armazene em tabelas separadas para cada país. Além disso, apresentaremos um código que permite criar ou apagar um banco de dados existente, bem como as tabelas correspondentes.


Carregando Dados de PIB de Países em um Banco de Dados SQL com C

Neste artigo, abordaremos como carregar dados do PIB (Produto Interno Bruto) de vários países em um banco de dados SQL utilizando C#. O objetivo é criar um aplicativo que se conecte a uma API do Banco Mundial, recupere os dados e os armazene em tabelas separadas para cada país. Além disso, apresentaremos um código que permite criar ou apagar um banco de dados existente, bem como as tabelas correspondentes.

Estrutura do Código

O código é estruturado em algumas partes principais:

  1. Definição da Classe Country: Representa um país com seu nome e código.
  2. Conexão ao Banco de Dados: O código permite ao usuário especificar o nome do banco de dados e verificar se ele já existe.
  3. Manipulação do Banco de Dados: O código pode criar ou apagar o banco de dados e suas tabelas conforme necessário.
  4. Recuperação de Dados da API: Utiliza a API do Banco Mundial para buscar os dados de PIB e os insere nas tabelas apropriadas.

Funcionalidade do Código

  1. Conexão ao Banco de Dados: O código se conecta ao SQL Server e solicita o nome do banco de dados. Ele verifica se o banco de dados existe e pergunta ao usuário se ele deseja apagá-lo ou inserir dados no banco existente.
  2. Criação de Tabelas: Para cada país, uma tabela é criada para armazenar os dados do PIB. Se a tabela já existir, ela é removida antes da criação da nova tabela.
  3. Consulta à API do Banco Mundial: Para cada país, o código consulta a API e obtém os dados do PIB entre os anos de 1989 e 2023. Os dados são então inseridos na tabela correspondente.

Tabela Explicativa

Abaixo, apresentamos uma tabela que explica as principais partes do código:

Parte do CódigoDescrição
CountryClasse que representa um país, contendo propriedades para o nome e o código do país.
MainMétodo principal que executa o fluxo do programa.
SqlConnectionUsado para conectar ao SQL Server.
HttpClientUsado para fazer solicitações HTTP à API do Banco Mundial.
SqlCommandExecuta comandos SQL no banco de dados, como criar ou apagar tabelas e inserir dados.
JArrayUsado para analisar a resposta JSON da API do Banco Mundial e extrair os dados necessários.
foreachEstrutura de loop usada para iterar sobre a lista de países e processar cada um.

Código Completo

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using Newtonsoft.Json.Linq;

namespace WbSqlLoadCountrys
{
    class Country
    {
        public string Name { get; }
        public string Code { get; }

        public Country(string name, string code)
        {
            Name = name;
            Code = code;
        }
    }

    internal class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Conectando no Banco de Dados");

            // Ask for the database name
            Console.Write("Digite o nome do banco de dados: ");
            string dbName = Console.ReadLine();

            // SQL Database connection string without the specific database
            string connectionString = $"Data Source=localhost;Initial Catalog=master;Integrated Security=True;";

            // Check if the database exists
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                string checkDbQuery = $"SELECT database_id FROM sys.databases WHERE name = '{dbName}'";
                SqlCommand checkDbCommand = new SqlCommand(checkDbQuery, connection);
                var dbExists = checkDbCommand.ExecuteScalar();

                if (dbExists != null)
                {
                    // Database exists, ask user if they want to drop it
                    Console.Write("O banco de dados já existe. Deseja apagá-lo? (s/n): ");
                    var response = Console.ReadLine().ToLower();

                    if (response == "s")
                    {
                        // Drop the existing database
                        string dropDbQuery = $"DROP DATABASE {dbName}";
                        SqlCommand dropDbCommand = new SqlCommand(dropDbQuery, connection);
                        dropDbCommand.ExecuteNonQuery();
                        Console.WriteLine($"Banco de dados '{dbName}' apagado com sucesso.");
                    }
                    else
                    {
                        Console.WriteLine($"Inserindo dados no banco de dados '{dbName}'.");
                    }
                }
                else
                {
                    // Create the new database
                    string createDbQuery = $"CREATE DATABASE {dbName}";
                    SqlCommand createDbCommand = new SqlCommand(createDbQuery, connection);
                    createDbCommand.ExecuteNonQuery();
                    Console.WriteLine($"Banco de dados '{dbName}' criado com sucesso.");
                }
            }

            // Now connect to the newly created or existing database
            connectionString = $"Data Source=localhost;Initial Catalog={dbName};Integrated Security=True;";

            // List of countries with their codes
            var countries = new List<Country>
            {
                new Country("Brazil", "BR"),
                new Country("Argentina", "AR"),
                new Country("United States", "US"),
                new Country("China", "CN"),
                new Country("Japan", "JP"),
                new Country("Germany", "DE"),
                new Country("India", "IN"),
                new Country("United Kingdom", "GB"),
                new Country("France", "FR"),
                new Country("Italy", "IT"),
                new Country("Canada", "CA"),
                new Country("South Korea", "KR"),
                new Country("Australia", "AU"),
                new Country("Spain", "ES"),
                new Country("Mexico", "MX"),
                new Country("Indonesia", "ID"),
                new Country("Netherlands", "NL"),
                new Country("Saudi Arabia", "SA"),
                new Country("Turkey", "TR"),
                new Country("Taiwan", "TW"),
                new Country("Switzerland", "CH")
            };

            int startYear = 1989;
            int endYear = 2023;
            Console.WriteLine("Criando Tabelas");

            // Connect to SQL Database and create tables
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                foreach (var country in countries)
                {
                    string tableName = $"GDP_Data_{country.Name.Replace(" ", "_")}";

                    // Drop existing table
                    string dropTableQuery = $"IF OBJECT_ID('{tableName}', 'U') IS NOT NULL DROP TABLE {tableName};";
                    using (SqlCommand dropCommand = new SqlCommand(dropTableQuery, connection))
                    {
                        dropCommand.ExecuteNonQuery();
                        Console.WriteLine($"Table '{tableName}' dropped successfully.");
                    }

                    // Create new table
                    string createTableQuery = $@"
                    CREATE TABLE {tableName} (
                        Id INT IDENTITY(1,1) PRIMARY KEY,
                        CountryCode NVARCHAR(3),
                        GDP DECIMAL(18, 2),
                        Year INT 
                    );";
                    using (SqlCommand createCommand = new SqlCommand(createTableQuery, connection))
                    {
                        createCommand.ExecuteNonQuery();
                        Console.WriteLine($"Table '{tableName}' created successfully.");
                    }

                    // Get GDP data from World Bank API
                    string apiUrl = $"https://api.worldbank.org/v2/country/{country.Code}/indicator/NY.GDP.MKTP.CD?date={startYear}:{endYear}&format=json";
                    Console.WriteLine("Conectando no webService");
                    using (HttpClient client = new HttpClient())
                    {
                        HttpResponseMessage response = await client.GetAsync(apiUrl);
                        if (response.IsSuccessStatusCode)
                        {
                            string jsonResponse = await response.Content.ReadAsStringAsync();
                            JArray jsonData = JArray.Parse(jsonResponse);
                            Console.WriteLine("Carregando os Dados");
                            foreach (var item in jsonData[1])
                            {
                                string countryCode = item["countryiso3code"].ToString();
                                string gdp = item["value"]?.ToString() ?? "0";
                                string year = item["date"].ToString();

                                // Insert data into SQL table
                                string insertQuery = $@"
                                INSERT INTO {tableName} (CountryCode, GDP, Year)
                                VALUES (@CountryCode, @GDP, @Year)";
                                using (SqlCommand insertCommand = new SqlCommand(insertQuery, connection))
                                {
                                    insertCommand.Parameters.AddWithValue("@CountryCode", countryCode);
                                    insertCommand.Parameters.AddWithValue("@GDP", decimal.Parse(gdp));
                                    insertCommand.Parameters.AddWithValue("@Year", int.Parse(year));

                                    insertCommand.ExecuteNonQuery();
                                }
                            }

                            Console.WriteLine($"Data added to table '{tableName}' successfully.");
                        }
                        else
                        {
                            Console.WriteLine($"Error retrieving data from API for {country.Name}");
                        }
                    }
                }
            }
        }
    }
}

Conclusão

Neste artigo, mostramos como desenvolver um aplicativo em C# para carregar dados de PIB de países em um banco de dados SQL. O código abrange desde a conexão ao banco até a manipulação de dados obtidos de uma API. Você pode adaptar esse código para adicionar novos países ou indicadores, conforme necessário.

Edvaldo Guimrães Filho Avatar

Published by