GAMBCODES

Gerador de Scripts de Inserção ao Banco de Dados

 

 Está semana me vi na necessidade de transformar uma planilha do Excel em um script em SQL para inserir os dados da planilha em uma tabela no banco de dados. Tal planilha continha uma lista de bancos associados a Febraban, com informações básicas sobre cada banco. Como seria demasiado trabalhoso criar os inserts manualmente um por um, resolvi que a melhor maneira seria criar uma aplicação para tal!

Portanto, transformei a planilha em .xls para .csv. Assim delimitei as colunas por “;”. Onde a primeira linha do arquivo continha as colunas correspondentes no banco de dados que irão ser inserido os dados; e as demais linhas os dados referentes as colunas.

Recursos Utilizados:

  • Microsoft Visual Studio 2008 Professional Edition ou similar;
  • Planilhas Excel ou similares;
  • Arquivos .csv;

Criando o Projeto

GeradorInserts

O projeto deverá conter:

  • Um TextBox para o caminho do arquivo .csv (txtArquivo);
  • Um Button para buscar o arquivo .csv (btnBuscaArquivo);
  • Mais um Button para gerar o arquivo .SQL (btnGerarInsert);
  • Um TextBox Multiline para a visualização do arquivo .csv (txtSaida);
  • Um StatusStrip contendo um ProgressBar (StatusStrip1,prgLoading). Inicialmente a propriedade Visible deve estar como False;
  • Um OpenFileDialog (odgArquivo);
  • Um SaveFileDialog (svfSalva);
  • Um formulário a mais para obter o nome da tabela do banco de dados (frmTabela – txtTabela – OK_Button – Cancel_Button). Indicado criar um tela de dialogo automática. Na lista de Templates do Visual Studio, você poderá encontrar o Template ‘Dialog’. E depois editá-lo da melhor forma.

Outras parafernálias adicionais deixo por sua conta.

É necessário importar o namespace System.Text e o namespace System.IO para a codificação do arquivo .SQL e para leitura e gravação de arquivos. Indo ao código será necessário a criação de várias iniciais:

Dim read As StreamReader
Dim writer As StreamWriter
Dim strLinhas As String = String.Empty
Dim intCountLinhas As Integer = 0

A variável read do tipo StreamReader lê o arquivo informado pelo usuário; e a variável writer do tipo StreamWriter escreve em um arquivo, neste caso em um arquivo .SQL. A classe StreamReader e StreamWriter  fazem parte do namespace System.IO, este namespace contém tipos para trabalhar com leitura e gravação de arquivos e outras coisas relacionada a arquivos. Informações adicionais sobre o namespace System.IO você poderá conferir aqui.

No evento cliclk do Button btnBuscaArquivo vemos o seguinte código:

Private Sub btnBuscaArquivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscaArquivo.Click
‘CONFIGURA FILTRO PARA ARQUIVOS .CSV
odgArquivo.Filter = ” Arquivo separado por vírgula (*.csv)|*.csv|Todos os arquivos (*.*)|*.*”
If odgArquivo.ShowDialog = Windows.Forms.DialogResult.OK Then
txtArquivo.Text = odgArquivo.FileName
txtSaida.Text = String.Empty
‘CAPTURA O ARQUIVO csv
Try
If IO.File.Exists(odgArquivo.FileName) Then
read = New IO.StreamReader(odgArquivo.FileName)
strLinhas = read.ReadLine
‘LÊ ATÉ O FINAL DO ARQUIVO
While strLinhas <> Nothing
txtSaida.Text &= strLinhas & vbCrLf
strLinhas = read.ReadLine
intCountLinhas += 1
End While
‘FECHA ARQUIVOS E LIBERA MEMÓRIA
read.Close()
read.Dispose()
End If
Catch ex As Exception
MessageBox.Show(“ERRO–> ” & ex.Message)
End Try
End If
End Sub

Logo de inicio é configurado o filtro de arquivos para o componente OpenFileDialog, onde a propriedade Filter é definida para arquivos .csv inicialmente. Uma explicação mais aprofundada desta propriedade pode-ser verificada aqui.  Caso o dialogo retorne OK do usuário, o arquivo será lido até seu fim e as linhas serão passadas para o TextBox txtSaida. A variável intCountLinhas  está sendo incrementada em 1 conforme lê-se uma linha, assim posteriormente será utilizada no ProgressBar.

Finalmente no evento Click do Button btnGerarInsert, temos a parte mais trabalhosa do Projeto:

Private Sub btnGerarInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGerarInsert.Click
‘SE NÃO TIVER SELECIONADO O ARQUIVO DE ENTRADA SAÍ DA ROTINA
If String.IsNullOrEmpty(txtSaida.Text) Then
MessageBox.Show(“Arquivo de Entrada Vazio!”, “!”, MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
Dim strColunas As String = String.Empty
Dim strInsert As String = String.Empty
Dim strTabela As String = String.Empty
Dim x As Integer = 0
‘OBTENDO NOME DA TABELA QUE SERÁ INSERIDO OS DADOS DO SCRIPT
If frmTabela.ShowDialog = Windows.Forms.DialogResult.OK Then
strTabela = frmTabela.txtTabela.Text
Else
Exit Sub
End If
‘CONFIGURA O DIALOGO DE SALVAMENTO PARA ARQUIVOS SQL
svfSalva.Filter = ” Arquivo SQL (*.sql)|*.sql|Todos os arquivos (*.*)|*.*”
Try
If svfSalva.ShowDialog = Windows.Forms.DialogResult.OK Then
‘CHAMA LOADING
prgLoading.Visible = True
‘CALCULO DE LOADING
x = 100 / (intCountLinhas – 1)
prgLoading.Step = x
‘DELETA ARQUIVO JÁ EXISTENTE
Try
If IO.File.Exists(svfSalva.FileName) Then
IO.File.Delete(svfSalva.FileName)
End If
Catch ex As Exception
MessageBox.Show(“Erro–> ” & ex.Message)
End Try
‘CRIA OBJETO PARA GRAVAÇÃO
writer = New IO.StreamWriter(svfSalva.FileName, True, Encoding.UTF8)
If IO.File.Exists(txtArquivo.Text) Then
‘CRIA OBJETO PARA LEITURA
read = New IO.StreamReader(txtArquivo.Text)
‘PEGA INFORMAÇÕES DAS COLUNAS
strLinhas = read.ReadLine
strColunas = “INSERT INTO ” & strTabela & ” (”
For Each caracter As String In strLinhas
If Not caracter = “;” Then
strColunas += caracter
Else
strColunas += “,”
End If
Next
strColunas += “) VALUES (‘”
‘GERANDO LINHAS DE INSERÇÃO E AS GRAVANDO NO ARQUIVO
While strLinhas <> Nothing
strLinhas = read.ReadLine
‘SAI DO LAÇO SE NÃO TIVER NADA A LER
If strLinhas Is Nothing Then
Exit While
End If
strInsert = String.Empty
strInsert += strColunas
‘VARENDO A STRING
For Each caracter As String In strLinhas
If Not caracter = “;” Then
strInsert += caracter
Else
strInsert += “‘,'”
End If
Next
strInsert += “‘);”
writer.WriteLine(strInsert)
prgLoading.PerformStep()
End While
End If
‘LIBERA ARQUIVOS E MEMÓRIA
read.Close()
read.Dispose()
writer.Close()
writer.Dispose()
MessageBox.Show(“Exportação concluída com sucesso!”, “!”, _
MessageBoxButtons.OK, MessageBoxIcon.Information)
prgLoading.Visible = False
End If
Catch ex As Exception
MessageBox.Show(“Erro–> ” & ex.Message)
End Try
End Sub

Coloquei um ProgressBar para informar ao usuário o estado da criação do script. Para que a barra de progresso seja incrementada de forma equilibrada, seguindo a quantidade de linhas do arquivo, foi necessário um cálculo onde pega-se a quantidade de linhas do arquivo menos um, pois a contagem começa a partir do zero, e divide-se por 100, onde 100 sendo o valor máximo do ProgressBar. Pode-se mudar o 100 pelo valor da propriedade Maximum do ProgressBar, pois se tiver a necessidade de mudar a o valor máximo o cálculo não será necessário modifica-lo. O nome da tabela foi pegado do Textbox do formulário frmTabela. O arquivo será gravado na codificação UTF8, para tal foi necessário definir na classe StreamWriter  como  Encoding.UTF8, por isso faz-se necessário a importação no namespace System.Text. Assim, lê-se continuamente e gravasse as linhas dos inserts no novo arquivo. Não tem muito segredo nesta rotina, o mais trabalhoso foi a concatenação das strings! De resto somente leitura e gravação de arquivos, coisas bem simples e básicas no Visual Basic .Net! Até mais cambada! Agora só ano que vem! Fui!

Comments

comments

Categories:   Uncategorized

Tags:  , ,

Comments