Após um tempo afastado do blog, vamos a mais um post técnico.
Recentemente no trabalho me deparei com a tarefa de extrair os dados de um Dataset e gerar um arquivo *.dbf. Pesquisei bastante uma forma de executar esta tarefa mas nenhuma foi satisfatória, então baseado em todo material que encontrei, conseguir executar a tarefa e resolvi postar sobre o assunto, como senti bastante dificuldades de encontrar material que sanasse todas as dúvidas e fosse mais objetivo, resolvi abordar esse assunto.
Agora de onde vem essa extensão *.dbf ?
Tem sua origem no dBASE o primeiro SGBD largamente utilizado industrialmente, pelo Apple II, Apple Macintosh e PC’s IBM para DOS, onde se tornou um dos softwares mais vendidos durante alguns anos. A partir de meados dos anos oitenta, muitas outras companhias produziram seus próprios "dialetos" ou variações do produto e da linguagem. Entre esses, estão: FoxPro (atual Microsoft Visual FoxPro), Arago, Force, Recital, dbFast, dbXL, QuickSilver, Clipper, xBase++, FlagShip e Harbour.
O formato de arquivo do dBase, o DBF, é muito usado por diversos aplicativos que precisam somente de um formato para armazenar seus dados estruturadamente.
Fonte: http://pt.wikipedia.org/wiki/DBase
Para ajudar na compreensão do assunto criei um aplicação WPF que recebe alguns dados de textboxes, monta o Dataset, cria o arquivo *.dbf e insere os valores do Dataset.
Primeiro abriremos o Visual Studio 2010, criar novo projeto e colocar o nome do projeto, conforme a figura 01:
Figura 01 – Criando projeto WPF no Visual Studio 2010.
Após criar o projeto temos que adicionar uma referência ao projeto, clique com o botão direito na pasta References e depois em Add Reference, depois vá na aba COM e selecione “Microsoft ADO Ext. 2.8 for DDL and Security”, e clique em OK conforme figuras 02 e 03:
Figura 02 – Abrindo a janela de referências .
Figura 03 – Selecionando a referência “Microsoft ADO Ext. 2.8 for DDL and Security”, na aba COM .
Agora vamos adicionar alguns componentes ao projeto, no modo design adicione três Labels, duas Textboxes, um Combobox, e um Botão, conforme figura 04:
Figura 04 – Adicionando componentes da toolbox ao projeto GeraDBF.
Após esse passos vamos a parte mais divertida, a codificação. Clique em qualquer área do formulário e aperte F7, para ir ao codebehind.
Agora criaremos o método que cria o Dataset, e faz as devidas validações para a chamada do método que cria o arquivo *.dbf, conforme a Listagem 01:
1: public DataSet datasetexample()
2: {
3: //Instanciando os objetos Dataset e Datatable para receber os valores do formulário
4: DataSet ds = new DataSet();
5: DataTable dt = new DataTable();
6:
7: //Setando o nome da tabela
8: dt.TableName = "Arquivo";
9: DataColumn col;
10:
11: //Criando as colunas
12: col = new DataColumn();
13: col.DataType = Type.GetType("System.Int32");
14: col.ColumnName = "Id";
15:
16: dt.Columns.Add(col);
17:
18: col = new DataColumn();
19: col.DataType = Type.GetType("System.String");
20:
21: col.ColumnName = "Name";
22: dt.Columns.Add(col);
23:
24: col = new DataColumn();
25: col.DataType = Type.GetType("System.String");
26:
27: col.ColumnName = "Sexo";
28: dt.Columns.Add(col);
29:
30: //Criando e atribuindo os valores as linhas
31: DataRow row;
32: row = dt.NewRow();
33:
34: row["Id"] = int.Parse(txtId.Text);
35: row["Name"] = txtName.Text;
36: row["Sexo"] = cbbSexo.SelectedValue.ToString().Substring(37,9);
37: row = dt.NewRow();
38:
39: dt.Rows.Add(row);
40:
41: //Adicionando a tabela ao Dataset
42: ds.Tables.Add("Arquivo");
43:
44: /* Efetuando checagem para criação do diretório
45: onde será salvo o arquivo *.dbf */
46: if (!(Directory.Exists("c:\\GeraDBF")))
47: {
48: Directory.CreateDirectory("c:\\GeraDBF");
49: }
50:
51: /* Checando a existência do arquivo *.dbf
52: e exibindo validação para substituição do arquivo. */
53: if (File.Exists("c:\\GeraDBF\\Arquivo.dbf"))
54: {
55: MessageBoxResult result = MessageBox.Show("Você deseja realmente apagar o arquivo?", "GeraDBF",
56: MessageBoxButton.YesNo,
57: MessageBoxImage.Question);
58:
59: if (result.Equals(MessageBoxResult.Yes))
60: {
61: //Deleta o arquivo se a opção for sim
62: File.Delete("c:\\GeraDBF\\Arquivo.dbf");
63:
64: //Chama o método que cria o arquivo *.dbf e o preencha com o Dataset
65: criarDBF(ds);
66: }
67:
68:
69: }
70: else
71: {
72: //Chama o método que cria o arquivo *.dbf e o preencha com o Dataset
73: criarDBF(ds);
74: }
75:
76: return ds;
77: }
Listagem 01 – Criando o método do tipo Dataset para validar e preencher o Dataset.
Criado o método datasetexample(), agora iremos criar o método criarDBF(), que gera o arquivo *.dbf e o preenche com o Dataset, conforme Listagem 02:
1: public DataSet criarDBF(DataSet ds)
2: {
3: //Seta as configurações de conexão OLEDB e o caminho do arquivo dbf, e abre a conexão
4: OleDbConnection oConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\\GeraDBF;Extended Properties=dBase III");
5: oConn.Open();
6:
7: //dDfine o comando de criação
8: OleDbCommand cmd = new OleDbCommand(" CREATE TABLE Arquivo (Id INTEGER, Name VARCHAR(16), Sexo VARCHAR(16))");
9:
10: cmd.Connection = oConn;
11:
12: //Execute o comando de criação para criar a tabela vazia
13: cmd.ExecuteNonQuery();
14:
15: //Adapter para pegar a base de dados vazia
16: OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Arquivo", oConn);
17:
18: //Atualiza a base de dados vazia com o Dataset, e fecha a conexão
19: da.Update(ds, "Arquivo");
20:
21: oConn.Close();
22:
23: return ds;
24: }
Listagem 02 – Criando o método do tipo Dataset para criar o arquivo *.dbf e preencher arquivo *.dbf com o Dataset.
Agora volte ao modo design e dê dois cliques no botão, e chame o método datasetexample(), no evento on_click do botão, conforme Listagem 03:
1: private void btnGerarDbf_Click(object sender, RoutedEventArgs e)
2: {
3: datasetexample();
4: }
Listagem 03 – Chamando o método datasetexample(), no evento on_click do botão.
Pronto, agora é só rodar o projeto e testar. Qualquer dúvida é só entrar em contato.
Segue abaixo link para download da solução para Visual Studio 2010, criada nesse post.
Download da solução: http://bit.ly/gOeZj5