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:
- Definição da Classe
Country: Representa um país com seu nome e código. - 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.
- Manipulação do Banco de Dados: O código pode criar ou apagar o banco de dados e suas tabelas conforme necessário.
- 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
- 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.
- 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.
- 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ódigo | Descrição |
|---|---|
Country | Classe que representa um país, contendo propriedades para o nome e o código do país. |
Main | Método principal que executa o fluxo do programa. |
SqlConnection | Usado para conectar ao SQL Server. |
HttpClient | Usado para fazer solicitações HTTP à API do Banco Mundial. |
SqlCommand | Executa comandos SQL no banco de dados, como criar ou apagar tabelas e inserir dados. |
JArray | Usado para analisar a resposta JSON da API do Banco Mundial e extrair os dados necessários. |
foreach | Estrutura 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.
