none
Erro na importação de dados Excel para SQL Server em Vb.net RRS feed

  • Pergunta

  • Boa tarde Pessoal,

    Poderia me ajudar com o seguinte problema:

    O erro apresentado é: Nenhuma mensagem de erro disponível, código de resultado: E_FAIL(0x80004005).

    Isso ocorre quando seleciono uma planilha Excel (.xlsx) e clico para importar os dados.

    A exception é apresentada na linha onde o dataadapter vai preencher o dataset

    Segue o código para apreciação

     

    Agradeço desde já

      If fupImportaDados.HasFile Then
    
          CaminhoArquivo = fupImportaDados.PostedFile.FileName
          objDataSet = New DataSet
    
          ConexaoExcel = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CaminhoArquivo & ";Extended Properties='Excel 12.0;HDR=YES;'"
    
          objDataAdapter = New OleDbDataAdapter("SELECT * FROM [BASE DE DADOS$]", ConexaoExcel)
    
          objDataAdapter.Fill(objDataSet)
    
          Dim objConexao As New SqlClient.SqlConnection(CONEXAO)
          Dim strSQL As String = "SPI_PAGAMENTOS"
          Dim objComando As New SqlClient.SqlCommand(strSQL, objConexao)
    
          objComando.CommandType = CommandType.StoredProcedure
    
          Try
    
            objConexao.Open()
    
            For Each dr As DataRow In objDataSet.Tables(0).Rows
              objComando.Parameters.Clear()
              objComando.Parameters.AddWithValue("@CD_LINHA", dr("TELEFONE/LINK"))
              objComando.Parameters.AddWithValue("@DS_TIPO", dr("TIPO"))
              objComando.Parameters.AddWithValue("@CD_CC", dr("CENTRO DE CUSTO"))
              objComando.Parameters.AddWithValue("@DS_CC", dr("DESCRIÇÃO"))
              objComando.Parameters.AddWithValue("@DS_DIRETORIA", dr("DIRETORIA"))
              objComando.Parameters.AddWithValue("@DS_GERENCIA", dr("GERÊNCIA"))
              objComando.Parameters.AddWithValue("@DS_COORDENACAO", dr("COORDENAÇÃO"))
              objComando.Parameters.AddWithValue("@DT_PERIODO", dr("MÊS E ANO"))
              objComando.Parameters.AddWithValue("@VL_PAGAMENTO", dr("PAGAMENTO"))
              objComando.Parameters.AddWithValue("@QTD_MINUTAGEM", dr("MINUTAGEM"))
              objComando.Parameters.AddWithValue("@DS_OPERADORA", dr("OPERADORA"))
              objComando.Parameters.AddWithValue("@DS_SERVICO", dr("SERVIÇO"))
              objComando.Parameters.AddWithValue("@DT_INCLUSAO", Convert.ToDateTime(Year(Now) & "-" & Month(Now) & "-" & Day(Now)))
              objComando.ExecuteNonQuery()
            Next
    
            ScriptManager.RegisterStartupScript(Page, Page.GetType(), Guid.NewGuid().ToString(), "alert('Dados importados com sucesso.');", True)
    
          Catch ex As Exception
            ScriptManager.RegisterStartupScript(Page, Page.GetType(), Guid.NewGuid().ToString(), "alert('Falha ao efetuar a importação de dados.\n\n Erro: " & ex.Message & "');", True)
          Finally
            objConexao.Close()
            objComando.Dispose()
            objDataAdapter.Dispose()
            objDataSet.Dispose()
          End Try
    
        End If

    System.NullReferenceException - Object reference not set to an instance of an object
    quarta-feira, 26 de maio de 2010 18:11

Respostas

  • Ops... olhando seu codigo.. eh que vc esta abrindo a conexao depois que esta executando o fill.... quando vc chama o fill.. ele busca pela conexao... ae ela nao existe.. ou esta fechada.. abre a conexao antes de dar o fill....

     

    • Marcado como Resposta Bruno Venturoza quarta-feira, 7 de julho de 2010 11:30
    terça-feira, 6 de julho de 2010 20:14

Todas as Respostas

  • Bom, primeiramente tenta fazer este select pelo proprio sql para ver se executa normal, faça este teste, depois faça pelo programa.

    msn: poseidonfba@hotmail.com
    quarta-feira, 26 de maio de 2010 18:13
  • Mas como eu faço pra identificar a planilha do Excel como um database?? Só dessa forma eu conseguirei realizar a instrução do próprio SQL, correto?


    System.NullReferenceException - Object reference not set to an instance of an object
    quarta-feira, 26 de maio de 2010 18:21
  • Só uma pergunta, porque não faz esta importação no proprio SQL Server Management ?

    Seria melhor.


    msn: poseidonfba@hotmail.com
    quarta-feira, 26 de maio de 2010 18:27
  • Porque dos lugares que encontrei documentação, acabei não entendendo muito bem. E também fiquei preocupado com a validação dos dados.

     

    Mas eu até cheguei pesquisar qual seria a melhor maneira de importar esses dados, pois serão realizadas uma vez por mês. A forma que será feita a importação é indiferente.


    System.NullReferenceException - Object reference not set to an instance of an object
    quarta-feira, 26 de maio de 2010 18:29
  • Cara, muito mais rapido pelo sql, ai tu usas um laço pra ler de linha a linha

    pelo sql vai tudo em um insert


    msn: poseidonfba@hotmail.com
    quarta-feira, 26 de maio de 2010 18:32
  • Vais usar desta forma:

     

    INSERT INTO TUA_TABELA (TEUS CAMPOS) 
    SELECT (CAMPOS DO EXCEL) FROM 
    OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;HDR=YES;Database=D:\arquivo.xlsx;','SELECT * FROM [BASE DE DADOS$]');

     

     


    msn: poseidonfba@hotmail.com
    quarta-feira, 26 de maio de 2010 18:34
  • E qual procedure de configuração eu preciso rodar para registro?

     

    Msg 7403, Level 16, State 1, Line 1

    The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.


    System.NullReferenceException - Object reference not set to an instance of an object
    quarta-feira, 26 de maio de 2010 18:51
  • Tu tens o excel 2007 instalado neste teu pc? qual a versão do SO?

    O teu sistema é 32bits?


    msn: poseidonfba@hotmail.com
    quarta-feira, 26 de maio de 2010 18:54
  • Eu tenho a versão 2007 instalada no Windows 7 de 64bits.
    System.NullReferenceException - Object reference not set to an instance of an object
    quarta-feira, 26 de maio de 2010 18:57
  • Seguinte, eu aqui na empresa uso desta forma, no próprio sql, a cada semana tenho que converter um excel de aproximadamente 50.000 linhas e desta forma é bem rápido, só que, uso Sistemas de 32bits, eu tinha previsto testar no Windows Server 2003 64bits mais gerou alguns problemas e por falta de tempo ainda não tive como voltar para este caso.

     

    Ainda não testei no windows 7, até que apareça outra solução faz como vc estava fazendo mesmo e tenta fazer os passos dete link para mudar a tua aplicação para plataforma 32bits

     

    http://ybbest.wordpress.com/2009/07/22/the-microsoft-ace-oledb-12-0-provider-is-not-registered-on-the-local-machine/


    msn: poseidonfba@hotmail.com
    quarta-feira, 26 de maio de 2010 19:06
  • Ok, irei efetuar os testes.

     

    Obrigado POSEIDON, abraços


    System.NullReferenceException - Object reference not set to an instance of an object
    quarta-feira, 26 de maio de 2010 19:19
  • Cara tenta compilar uma versão release e rodar o seu programa.. creio que seja isso estou trabalhando na mesma coisa e tive este problema.. direto pelo executavel nao tive problemas...
    terça-feira, 6 de julho de 2010 20:09
  • Ops... olhando seu codigo.. eh que vc esta abrindo a conexao depois que esta executando o fill.... quando vc chama o fill.. ele busca pela conexao... ae ela nao existe.. ou esta fechada.. abre a conexao antes de dar o fill....

     

    • Marcado como Resposta Bruno Venturoza quarta-feira, 7 de julho de 2010 11:30
    terça-feira, 6 de julho de 2010 20:14
  • Não havia me atentado. Obrigado.


    System.NullReferenceException - Object reference not set to an instance of an object
    quarta-feira, 7 de julho de 2010 11:30