Joca Posted March 15, 2009 at 09:44 PM Report Share #250906 Posted March 15, 2009 at 09:44 PM 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? ? '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 Link to comment Share on other sites More sharing options...
Joca Posted March 18, 2009 at 09:40 PM Author Report Share #251708 Posted March 18, 2009 at 09:40 PM 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.... Link to comment Share on other sites More sharing options...
scorch Posted March 18, 2009 at 09:45 PM Report Share #251715 Posted March 18, 2009 at 09:45 PM 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. 😞 PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now