none
importar csv para tabela sql server via vb RRS feed

  • Pergunta

  • ppl boas! Tudo bem?

    Preciso urgentemente de saber como vou importar os dados de um ficheiro .csv para uma tabela sql server 2008 r2.

    Nota:O ficheiro .csv é gerado a partir de um excel. (Não sei se isso influencia)

    Agradeço qualquer tipo de resposta.

    Pelo que já pesquisei terei que usar o CsvDataReader e SqlBulkCopy. Mas como aplico isso no vb? Encontro é muito explicação para asp.net. :(

    Obrgiado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    segunda-feira, 20 de fevereiro de 2012 22:23

Respostas

  • Deste jeito:

    http://www.dotnetcurry.com/ShowArticle.aspx?ID=323

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 22 de fevereiro de 2012 21:43
  • Seu CSV usa ";"(ponto e virgula) mas vc esta mandando quebrar por ","(virgula).

    sugiro que vc comece a analisar um pouco o codigo. Olhe essa linha:

    Dim data() As String = line.Split(","c)

    Ela diz: quebre (split) line em um vetor (data) usando o caractere ","

    se vc olhar o CSV nao vai encontrar nenhuma ",", logo nada é quebrado.. logo o vetor é vazio.. logo vai dar erro porque data é vazio e vc esta tentanto jogar um vazio para row.ItemArray que nao gosta de vazios.

    Mude para 

    Dim data() As String = line.Split(";"c)

    Que provavelmente vai funcionar, desde que o CSV seja bem comportado e tenha pelo menos um caracter ; por linha.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée




    quinta-feira, 23 de fevereiro de 2012 15:12

Todas as Respostas

  • Será que isto atende as minhas necessidades?

    Obrigado

    http://social.msdn.microsoft.com/Forums/pt-BR/sqlintegrationservices/thread/1f0f0fff-135d-4cc5-858b-83ee86e3c98c


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    terça-feira, 21 de fevereiro de 2012 00:26
  • Prezado,

    Parece que o link que você postou pode te ajudar a resolver sua necessidade... Você tentou utilizá-lo?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    terça-feira, 21 de fevereiro de 2012 11:04
    Moderador
  • Prezado(a),
    Estou migrando seu post para o fórum de Acesso a Dados.
    Por favor, das próximas vezes que tiver alguma dúvida relacionada a esse assunto, poste por lá.
    Obrigado.

    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    terça-feira, 21 de fevereiro de 2012 11:05
    Moderador
  • Obrgiado Andre

    Já tentei o código mas da-me os seguintes erros:

    Error 2 Type 'Variables' is not defined.

    Error 3 'Dts' is not declared. It may be inaccessible due to its protection level.

    Duvidas:

    Na linha "flist = Directory.GetFiles("Z:\")" especifico a localização do ficheiro .csv né?

    Na linha "oleda.Fill(dt, Dts.Variables("ImportedFileList").Value)" especifico a tabela no sql server.

    Observações:

    O ficheiro .csv basicamente é um excel mas sem formatações e macros, certo? Pois o ficherio que possuo abre no excel e tem vais colunas.

    OBrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quarta-feira, 22 de fevereiro de 2012 18:14
  • Nao.. Um ficheiro csv é um ficheiro puramente texto onde os dados sao separarados por virgula ou ponto e virgula (CSV=Comma separeted values, valores separados por virgula). Voce atée pode usar o excel para gerar e ler um csv, mas ele nao é um ficheiro excel propriamente dito.

    Se vc conseguir abrir o ficheiro com o bloco de notas e ler algo do tipo:

    Campo1,Campo2,Campo3,Campo4,Campo5

    1,2,3,4,5

    3,4,5,6,7

    6,7,8,9,0

    Entao vc tem um legitimo CSV, caso contrario é outra coisa e nao serve para o bulkcopy.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 22 de fevereiro de 2012 19:16
  • William consigo abri o ficheiro csv gerado pelo excel no note pad e aparece os dados separados por viruglas:)

    quer dizer que estou perante um ficheiro .csv, né?

    Agora o meu problema é como fazo para importar o seu conteudo para uma tabela sql server através do vb.net.

    Obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quarta-feira, 22 de fevereiro de 2012 20:31
  • Deste jeito:

    http://www.dotnetcurry.com/ShowArticle.aspx?ID=323

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quarta-feira, 22 de fevereiro de 2012 21:43
  • Boas

    Estou a exprimentar o codigo da seguinte forma, mas da-me este erro:

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim dt As New DataTable()
            Dim line As String = Nothing
            Dim i As Integer = 0
    
            Using sr As StreamReader = File.OpenText("C:\Documents and Settings\Flashed\Desktop\vb\teste.csv")
                line = sr.ReadLine()
                Do While line IsNot Nothing
                    Dim data() As String = line.Split(","c)
                    If data.Length > 0 Then
                        If i = 0 Then
                            For Each item In data
                                dt.Columns.Add(New DataColumn())
                            Next item
                            i += 1
                        End If
                        Dim row As DataRow = dt.NewRow()
                        row.ItemArray = data
                        dt.Rows.Add(row)
                    End If
                    line = sr.ReadLine()
                Loop
            End Using
    
            Dim myConnectionString As String = _
            "Data Source=Flashed;Initial Catalog=dados;Integrated Security=True;User Instance=False"
            Dim connection As New SqlConnection(myConnectionString)
            connection.Open()
            Using copy As New SqlBulkCopy(connection)
                copy.ColumnMappings.Add(0, 0)
                copy.DestinationTableName = "actualizar"
                copy.WriteToServer(dt)
            End Using
    
    
        End Sub

    Erro (linha- row.ItemArray = data)

    Input array is longer than the number of columns in this table.

    O ficheiro csv e a tabela tem apenas uma coluna. Na tabela tenho a coluna "f2" e no csv não tem nome.. 

    Não tenho que especificar a folha do ficheiro csv?

    Obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com


    quinta-feira, 23 de fevereiro de 2012 10:28
  • poste aqui um trecho do CSV... o problema esta certamente lá... pelo menos umas 20 linhas.

    Em qual linha do codigo apresenta o erro? Nesta:

    Dim data() As String = line.Split(","c) ??


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quinta-feira, 23 de fevereiro de 2012 13:57
  • O erro é nesta linha:row.ItemArray = data

    Aqui:

    ..

     Dim row As DataRow = dt.NewRow()

    row.ItemArray = data dt.Rows.Add(row)

    ...

    Trecho do ficheiro .csv

    teste;
    ;5
    joºão;32
    rui;
    dfas;teste
    paulo;uso
    assunto;pai
    ;
    1,5;
    1,2;
    5;
    1000;

    Obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quinta-feira, 23 de fevereiro de 2012 14:41
  • Seu CSV usa ";"(ponto e virgula) mas vc esta mandando quebrar por ","(virgula).

    sugiro que vc comece a analisar um pouco o codigo. Olhe essa linha:

    Dim data() As String = line.Split(","c)

    Ela diz: quebre (split) line em um vetor (data) usando o caractere ","

    se vc olhar o CSV nao vai encontrar nenhuma ",", logo nada é quebrado.. logo o vetor é vazio.. logo vai dar erro porque data é vazio e vc esta tentanto jogar um vazio para row.ItemArray que nao gosta de vazios.

    Mude para 

    Dim data() As String = line.Split(";"c)

    Que provavelmente vai funcionar, desde que o CSV seja bem comportado e tenha pelo menos um caracter ; por linha.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée




    quinta-feira, 23 de fevereiro de 2012 15:12
  • :( Tem razão, esqueci-me disso.

    Obrigado :)

    Ultima nota: tenho campos em que me estão aparecer ponto de "?" no lugar de letras como "ç" e "ã". Tenho os campos todos com varchar(50). Que formatação devo optar? 

    Campos com estes dados "14-02-2012" devem estar formatados com datetime né'

    Obrigado ;)


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quinta-feira, 23 de fevereiro de 2012 16:20
  • Isso ocorre devido ao formato (encoding) do fichiero CSV. Ele esta à usar UTF-16.

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quinta-feira, 23 de fevereiro de 2012 16:40
  • como posso mudar ele?

    Sabe porque que da-me este erro?:

    Received an invalid column length from the bcp client for colid 2.

    Acontece quando tento copiar mais que duas colunas...


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quinta-feira, 23 de fevereiro de 2012 16:44
  • Leia a mensagen:

    Received an invalid column length from the bcp client for colid 2.

    Traduzindo:

    Recebido uma coluna de tamanho  invalido de um cliente bcp para colid (id da coluna) 2

    Ou seja, seu csv possui um dado que é maior (possui mais caracteres) que a coluna de destino... 

    Duas soluçoes.. ou vc garante o a padronizaçao de dados do CSV ou aumenta o tamanho da coluna 2 no banco de dados...

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée



    quinta-feira, 23 de fevereiro de 2012 16:51
  • aumentei a coluna no sql server. eu estive para exprimentar mas achei melhor perguntar :)

    Bem, 6 segundos para 90000 dados. Acho que está bom :) hehe

    O que acha?

    Obrigado por tudo


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    quinta-feira, 23 de fevereiro de 2012 18:41