using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Data.Common;

namespace FrontEnd
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //recupera as strings de conexão do arquivo de configuração (app.config) em uma //collection
            ConnectionStringSettingsCollection strings = ConfigurationManager.ConnectionStrings;

            //adiciona o valor inicial para a combobox
            cboProvider.Items.Add("Selecione o provider ...");

            //adiciona na combobox cada string de conexão encontrado no app.config 
            for (int i = 0; i <= strings.Count - 1; i++)
            {
                if (strings[i].Name != "LocalSqlServer")
                    cboProvider.Items.Add(strings[i].Name);
            }

            //posiciona no primeiro item da combobox
            cboProvider.SelectedIndex = 0;

        }

        private void cboProvider_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboProvider.SelectedIndex != 0)
            {
                // recupera o provider da conexão no app.config através da opção selecionada no combobox
                string provider = ConfigurationManager.ConnectionStrings[cboProvider.SelectedItem.ToString()].ProviderName;

                // recupera a string de conexão no app.config através da opção selecionada no combobox
                string strConexao = ConfigurationManager.ConnectionStrings[cboProvider.SelectedItem.ToString()].ConnectionString;

                // recupera o factory através do provider enviado
                DbProviderFactory factory = DbProviderFactories.GetFactory(provider);

                // recupera o objeto de conexão gerado pelo factory
                DbConnection conn = factory.CreateConnection();

                // configura a string de conexão
                conn.ConnectionString = strConexao;

                // abre a conexão
                conn.Open();

                // intancia o DataTable para recuperação dos dados
                DataTable dt = new DataTable();

                // recupera/configura o objeto command gerado pelo factory
                DbCommand command = factory.CreateCommand();
                command.CommandText = "SELECT ProductID, ProductName FROM Products";
                command.CommandType = CommandType.Text;
                command.Connection = conn;

                // recupera o objeto adapter gerado pelo factory
                DbDataAdapter adap = factory.CreateDataAdapter();
                adap.SelectCommand = command;

                // preenche o dataTable
                adap.Fill(dt);

                //preenche a dataGridView com os dados do DataTable
                dtgDados.DataSource = dt;
            }          

        }
    }
}