• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Joca

Como inserir os nomes dos cabeçalhos na base de dados?

3 mensagens neste tópico

Boas! Estou a usar SQL Server Compact Edition.

Nome do Ficheiro: TESTE.txt.

Conteúdo do TESTE.txt:

  Nome ; Idade ; Outros;

  Joca; 100 anos ; Qualquer coisa ;

  André  ; Ri-te ; ;

Estou a seguir o seguinte tutorial (percebe-se facilmente vendo o video):

http://www.der-softwareentwickler-blog.de/2008/11/10/video-tutorial-vbnet-und-sql-server-compact-edition/

A primeira linha do ficheiro TESTE.txt é a que contém o cabeçalho das colunas.

Já tenho o seguinte código feito mas, já vou na criação da matriz para a matriz anterior e, acho que já estou a complicar demais.

Queria saber como dou a volta ao erro obtido na inserção dos nomes das colunas.

O erro é eu não conseguir visualizar todos os nomes das colunas pois, no máximo só consigo obter a última coluna com o Ubound no código seguinte em "<--- ERRO AQUI".

A ideia é colocar todo o conteúdo do ficheiro na base de dados (nome das colunas e, preencher as respectivas linhas).

Alguma ideia?  :hmm:

'Adicionei System.Data.SqlServerCe.dll na opção ADD REFERENCE (botão 
'direito do rato, em cima do nome da solution) na janela SOLUTION EXPLORER.
'E depois escrevi:
Imports System.Data.SqlServerCe

Public Class Form1

    Dim _nomeDaBD As String
    Dim _nomeDoFicheiroAcedido As String



    Sub SetSQL(ByVal SQL As String)
        Dim conn As New SqlCeConnection
        Dim cmd As New SqlCeCommand

        conn.ConnectionString = "datasource = " & _nomeDaBD 
        cmd.Connection = conn
        cmd.CommandText = SQL
        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()

    End Sub

    Sub GetSQL(ByVal SQL As String) 
        Dim conn As New SqlCeConnection
        Dim cmd As New SqlCeCommand

        conn.ConnectionString = "datasource = " & _nomeDaBD 
        cmd.Connection = conn
        cmd.CommandText = SQL
        Dim da As New SqlCeDataAdapter(cmd)
        Dim dt As New DataTable

        conn.Open()
        da.Fill(dt)
        conn.Close()
        DataGridView1.DataSource = dt

    End Sub


    Private Sub btnCriaBaseDeDados_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriaBaseDeDados.Click

        With SaveFileDialog1
            .Filter = "Base de dados|*.sdf"
            .FileName = ""
        End With

        If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK And _
        SaveFileDialog1.FileName <> String.Empty Then

            Dim _SqlCeEngine As New SqlCeEngine

            'Guarda o nome da BD a criar
            _nomeDaBD = SaveFileDialog1.FileName

            _SqlCeEngine.LocalConnectionString = "datasource = " & _nomeDaBD
            _SqlCeEngine.CreateDatabase()

        Else
            Return
        End If



    End Sub

    Private Sub btnLocalizaFicheiroParaInserirNaBD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLocalizaFicheiroParaInserirNaBD.Click

        With OpenFileDialog1
            .Filter = "Ficheiros CSV (*.csv)|*.csv|Ficheiros Texto (*.txt)|*.txt"
            .FileName = ""
        End With

        If _nomeDaBD <> String.Empty Then


            If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then

                'Guarda o nome do ficheiro acedido
                _nomeDoFicheiroAcedido = OpenFileDialog1.FileName

                'Cria a tabela:
                'SetSQL("Create Table Test")

                Dim leitorTexto As IO.StreamReader

                Dim texto As String

                leitorTexto = New IO.StreamReader(_nomeDoFicheiroAcedido, System.Text.Encoding.Default)

                texto = leitorTexto.ReadLine() 'para ler só a primeira linha do ficheiro (pois, contém 
                'o cabeçalho das colunas).

                Dim _matrizDasColunas As Array = Split(texto, ";") 'estou a dizer para separar tudo o que tenha 
                ' ";" (ponto e vírgula) pois, é este o delimitador.

                Dim _matrizDasColunasAInserir As Array = _matrizDasColunas

                Dim i As Integer = 0

                For i = 0 To UBound(_matrizDasColunas)

                    MessageBox.Show(_matrizDasColunas(i)) '<- Teste só para ver se assume os cabeçalhos.

                    _matrizDasColunasAInserir(i) = _matrizDasColunas(i) & " nchar(100)"

                Next


                'Cria a tabela:
                SetSQL("Create Table Test (MyID int identity(0,1), " & _matrizDasColunasAInserir(UBound(_matrizDasColunas)) & ")") ' "<--- ERRO AQUI"

                'Insere valores
                'SetSQL("Insert into Test (Col1) values ('Hello World')")

                'Obtém os valores na DataGridView
                GetSQL("Select * from Test")

            End If

        Else
            MessageBox.Show("Primeiro precisa de criar a base de dados!" & vbCrLf & _
                              "Clique no botão 'Criar base de dados'")
        End If
    End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ninguém?  :(

Bem... fiz uma "aldrabice", usando uma stringBuilder e, apesar de ter inserido correctamente os cabeçalhos, não tive tanta sorte na inserção das linhas na BD.

Será que deveria fazer um FOR NEXT e, ler tudo de uma só vez? É possível? Cabeçalho e linhas de uma vez só?

Segue o código actual do botão "btnLocalizaFicheiroParaInserirNaBD":

 With OpenFileDialog1
            .Filter = "Ficheiros CSV (*.csv)|*.csv|Ficheiros Texto (*.txt)|*.txt"
            .FileName = ""
        End With

        If _nomeDaBD <> String.Empty Then


            If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then

                'Guarda o nome do ficheiro acedido
                _nomeDoFicheiroAcedido = OpenFileDialog1.FileName

                Dim leitorTexto As IO.StreamReader

                Dim _cabeçalhos As String

                leitorTexto = New IO.StreamReader(_nomeDoFicheiroAcedido, System.Text.Encoding.Default)

                _cabeçalhos = leitorTexto.ReadLine() 'para ler só a primeira linha do ficheiro (pois, contém 
                'o cabeçalho das colunas).


                Dim _matrizDasColunas As Array = Split(_cabeçalhos, ";") 'estou a dizer para separar tudo o que tenha 
                ' ";" (ponto e vírgula) pois, é este o delimitador.

                Dim i As Integer = 0

                Dim _strBuilderCabeçalhos As New StringBuilder 'FOI NECESSÁRIO ACRESCENTAR ISTO.

                For i = 0 To UBound(_matrizDasColunas)

                    'MessageBox.Show(_matrizDasColunas(i)) '<- Teste só para ver se assume os cabeçalhos.

                     _strBuilderCabeçalhos.Append("" & "," & " " & _matrizDasColunas(i) & " nchar(100)") 

                Next


                'Cria a tabela:
                 SetSQL("Create Table Test (MyID int identity(0,1)" & _strBuilderCabeçalhos.ToString & ")") 

                

                Dim _linhas As String

                _linhas = leitorTexto.ReadToEnd  'para ler tudo e, na variável "j" para o respectivo FOR NEXT 
                'digo para começar na 2.ª linha pois, a primeira linha contém os cabeçalhos.

                Dim _matrizDasLinhas As Array = Split(_linhas, ";") 'estou a dizer para separar tudo o que tenha 
                ' ";" (ponto e vírgula) pois, é este o delimitador.

                Dim j As Integer = 1 'digo para começar na segunda linha do ficheiro.

                Dim _strBuilderLinhas As New StringBuilder 

                For j = 0 To UBound(_matrizDasLinhas)

                    'MessageBox.Show(_matrizDasLinhas(j)) '<- Teste só para ver se assume os cabeçalhos.

                    _strBuilderLinhas.Append("" & _matrizDasLinhas(j) & "") 'ALTEREI PARA ISTO.

                Next

                'Insere valores
                 SetSQL("Insert into Test (" & _strBuilderCabeçalhos.ToString & ")" & " values ('" & _strBuilderLinhas.ToString & "')") 'DÁ ASNEIRA AQUI POR CAUSA DO FOR NEXT ACIMA.

                'Obtém os valores na DataGridView
                GetSQL("Select * from Test")

            End If

        Else
            MessageBox.Show("Primeiro precisa de criar a base de dados!" & vbCrLf & _
                              "Clique no botão 'Criar base de dados'")
        End If

off-topic: que é que aconteceu à outra opção de exibição de código? Era bem melhor... Torna-se difícil de ler com este tamanho de letra e, nem dá para aumentar....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

off-topic: que é que aconteceu à outra opção de exibição de código? Era bem melhor... Torna-se difícil de ler com este tamanho de letra e, nem dá para aumentar....

Estava a dar uns problemas com o SMF 2 e foi removida, temporariamente acho eu. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora