Para começar, vou mostrar como preencher um controle DataGriView em uma aplicação Windows Forms. Vamos lá…
Para acompanhar os exemplos mostrados no artigo, você deve possuir instaladas as seguintes ferramentas:
– Visual C# Express Edition ou o SharpDevelop 2.2
Eu vou começar usando o SharpDevelop 2.2 apenas para variar, mas você pode usar o Visual C# Express 2008.
1- Preenchendo o DataGridView com dados de um banco de dados Access com um DataTable
Vou criar uma solução Windows para exibir os dados da tabela Clientes do banco de dados Cadastro.mdb cuja estrutura é a seguinte:
Abra o SharpDevelop e no menu Arquivo selecione Novo e em seguida Solução;
Na janela Novo Projeto selecione C#->Aplicações Windows e na janela Modelos marque Aplicação Windows e informe o nome da solução , no meu caso: AcessoDadosC;
A partir da janela Ferramentas abra a guia Data e selecione o controle DataGridView arrastando-o para o formulário e configurando sua propriedade Dock para Top. A seguir na guia Windows Forms arraste o controle Button para o formulário e defina sua propriedade Dock para Botton. O resultado final você vê na figura abaixo:
Inclua agora o código do botão C# associado ao evento Click do botão conforme abaixo:
void Button1Click(object sender, EventArgs e)
{
//define a string de conexao com provedor caminho e nome do banco de dados
string strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";
//define a instrução SQL
string strSql = "SELECT * FROM Clientes";
//cria a conexão com o banco de dados
OleDbConnection con = new OleDbConnection(strProvider);
//cria o objeto command para executar a instruçao sql
OleDbCommand cmd = new OleDbCommand(strSql, con);
//abre a conexao
con.Open();
//define o tipo do comando
cmd.CommandType = CommandType.Text;
//cria um dataadapter
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
//cria um objeto datatable
DataTable clientes = new DataTable();
//preenche o datatable via dataadapter
da.Fill(clientes);
//atribui o datatable ao datagridview para exibir o resultado
dataGridView1.DataSource = clientes;
}
Nota: Lembrando que temos que declarar os namespaces:
using System.Data;
using System.Data.OleDb;
O código acima está todo comentado e retorna todos os dados da tabela Clientes exibindo-os no DataGridView conforme abaixo:
2- Exibindo os dados em um DataGridView com DataReader
Se você desejar usar o DataReader (OledDb ou Sql) para ler os registros da tabela e exibir no DataGridView vai ter um pouco mais de trabalho pois não poderá atribuir o objeto DataReader à propriedade DataSource do controle.
A estratégia que você deverá seguir é a seguinte:
1- Obter quantas colunas existe na tabela;
2- Ler o nome de cada coluna e criar o cabeçalho no DataGridView;
3- Ler cada um dos registros e verificar qual o tipo de dados de cada uma das colunas;
4- Obter o valor da coluna usando o método apropriado;
Vamos incluir um novo controle Button no formulário e digitar o código abaixo no seu evento Click():
void Button2Click(object sender, EventArgs e)
{
//define a string de conexao com provedor caminho e nome do banco de dados
string strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";
//define a instrução SQL
string strSql = "SELECT * FROM Clientes";
//cria a conexão com o banco de dados
OleDbConnection con = new OleDbConnection(strProvider);
//cria o objeto command para executar a instruçao sql
OleDbCommand cmd = new OleDbCommand(strSql, con);
//abre a conexao
con.Open();
//define o tipo do comando
cmd.CommandType = CommandType.Text;
//obtem um datareader
OleDbDataReader dr = cmd.ExecuteReader();
//Obtem o número de colunas
int nColunas = dr.FieldCount;
//percorre as colunas obtendo o seu nome e incluindo no DataGridView
for (int i=0; i < nColunas; i++)
{
dataGridView1.Columns.Add(dr.GetName(i).ToString() ,dr.GetName(i).ToString());
}
}
Note que repetimos o código inicial sendo que o código destacado em amarelo é o código novo. Executando a solução e clicando no botão – Preencher com DataReader – iremos obter:
Já temos os cabeçalhos das colunas no DataGridView criadas com os nomes das colunas da tabela Clientes ; falta percorrer os registros e preencher o controle.
Para fazer isso devemos tomar os seguintes cuidados:
– Quanto obtemos o dado de um coluna em um DataReader temos que especificar o tipo de dados, pois há um método para cada tipo de dados; assim em uma coluna do tipo Integer devemos usar o método GetInt32() para obter o valor.
– Então temos que percorrer cada linha da tabela e verificar em cada coluna qual o tipo de dados para usar o método adequado e obter o seu valor;
– Para saber o tipo de dados de um coluna usaremos o método GetFieldType() verificando se o mesmo é uma string (System.String) ou um inteiro (System.Int32) ou uma data (System.Date)
O código que devemos incluir para obter o resultado esperado pode ser visto a seguir:
void Button2Click(object sender, EventArgs e)
{
//define a string de conexao com provedor caminho e nome do banco de dados
string strProvider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\dados\\Cadastro.mdb";
//define a instrução SQL
string strSql = "SELECT * FROM Clientes";
//cria a conexão com o banco de dados
OleDbConnection con = new OleDbConnection(strProvider);
//cria o objeto command para executar a instruçao sql
OleDbCommand cmd = new OleDbCommand(strSql, con);
//abre a conexao
con.Open();
//define o tipo do comando
cmd.CommandType = CommandType.Text;
//obtem um datareader
OleDbDataReader dr = cmd.ExecuteReader();
int nColunas = dr.FieldCount;
for (int i=0; i < nColunas; i++)
{
dataGridView1.Columns.Add(dr.GetName(i).ToString() ,dr.GetName(i).ToString());
}
//define um array de strings com nCOlunas
string[] linhaDados = new string[nColunas];
//percorre o DataRead
while (dr.Read())
{
//percorre cada uma das colunas
for (int a =0 ; a < nColunas; a++)
{
//verifica o tipo de dados da coluna
if (dr.GetFieldType(a).ToString() == "System.Int32")
{
linhaDados[a] = dr.GetInt32(a).ToString();
}
if (dr.GetFieldType(a).ToString() == "System.String")
{
linhaDados[a] = dr.GetString(a).ToString();
}
if (dr.GetFieldType(a).ToString() == "System.DateTime")
{
linhaDados[a] = dr.GetDateTime(a).ToString();
}
}
//atribui a linha ao datagridview
dataGridView1.Rows.Add(linhaDados);
}
}
O código que foi incluído está destacado em amarelo. Executando o projeto iremos obter:
Embora aborde conceitos básicos, este artigo mostrou como podemos tratar os dados a partir de um DataReader exibindo-os em um DataGridView() usando C#.
Pegue o projeto completo para SharpDevelop aqui: AcessoDadosC.zip
Referências:
Retrieving Data Using the DataReader
DataSet x DataReader – Uma questão de desempenho?
ADO.NET – Obtendo quantos registros um DataReader vai retornar
Preenchendo um DataTable com um DataReader
DataReader ou DataSet?
ADO.NET – Uma visão geral : Objetos Connection