none
Importação de arquivo EXCEL (CommandBuilder) RRS feed

  • Pergunta

  • Olá amigos.

    Estou passando por problemas e gostaria da ajuda e idéias de vocês.

     

    Estou desenvolvendo uma aplicação para importação de arquivos Excel para um banco SQL Server que funcionará tanto pela rede local, quanto pela internet atraves de WebService.

     

    Estou fazendo um SELECT nas planilhas do arquivo excel e jogando dentro de um DataSet e exibindo em um DataGrid na aplicação.

     

    Antes da importação dos dados é preciso fazer diversas validações nos dados.

     

    A planilha a ser importada é dinâmica. Não sei quais e nem quantos campos serão importados na planilha e as colunas podem estar em qualquer ordem.

    (normalmente a primeira linha contém o nome das colunas de destino, caso não tenha, na aplicação o usuário pode selecionar, e também seleciona a tabela de destino no banco).

     

    Neste caso tive a idéia de usar o CommandBuilder para não precisar gerar os comandos SQL manualmente.

     

    No adapter que uso o CommandBuilder, faço um "SELECT * FROM TABELA" para que sejam gerados os codigos INSERT e UPDATE.

     

    O INSERT é gerado corretamente e Insere os dados normalmente.

     

    Problema 1:

    O comando UPDATE gerado pelo CommandBuilder contém TODOS os campos na clausula WHERE, assim meus dados que já existem no banco não sao atualizados. Soube que no comando SELECT é necessário ter os campos de chave primária para os comandos serem gerados corretamente. Mas estes campos são inclusos no meu SELECT e mesmo assim ele não reconhece.

     

    Problema 2:

    Com esse problema, mudei de tática, e gero em tempo de execução o comando update de acordo com o nome dos campos do meu DataSet. Mas passei por outro problema. Todos os campos do DataSet buscados da planilha ficam do tipo STRING, independente se o campo contém valores numéricos, datas ou boleanos. E na hora de adicionar os parametros para o comando Update, ocorre problemas na hora de acionar os valores dos campos que não são do tipo STRING.

     

    Problema 3:

    Qual a melhor forma de verificar se os dados da planilha já estão no banco ou não? se o registro é para ser Update ou Insert? Atualmente faço um "SELECT *" na tabela de destino, e coloco em outro DataSet. Faço um loop nos registros da planilha verificando se existem no DataSet que veio do banco, caso exista, mudo o RowStatus do DataSet dos dados da planilha para SetModified(). caso contrário SetAdded();.

     

    Sei que não é a melhor forma, tanto que a aplicação será usada pela Internet. A conexão pode ser lenta. Pensei em fazer o mesmo SELECT * na tabela do banco e usar o .Merge do dataSet para unir os dois dados, assim acho que o comando Update do caso 2 funcionaria. Mas como os tipos dos campos dos DataSet são diferentes, acredito que o Merge não irá funcionar... Nem consigo mudar o tipo de dados de uma coluna do dataset porque já contem dados.

     

    Alguém tem alguma idéia, uma dica?

    Espero ajuda de vocês.

     

    grande abraço.

    Obrigado.

    segunda-feira, 23 de abril de 2007 02:54

Respostas

  • Oi !

     

    Uma pequena ajuda : No .NET 2.0 a propriedade conflictOption determina a forma de geração do Update.

     

    Você precisa do seguinte :

     

    Code Snippet

    cb.ConflictOption =ConflictOption.OverwriteChanges

     

    []'s

     

     

    segunda-feira, 23 de abril de 2007 03:45

Todas as Respostas

  • Oi !

     

    Uma pequena ajuda : No .NET 2.0 a propriedade conflictOption determina a forma de geração do Update.

     

    Você precisa do seguinte :

     

    Code Snippet

    cb.ConflictOption =ConflictOption.OverwriteChanges

     

    []'s

     

     

    segunda-feira, 23 de abril de 2007 03:45
  • Obrigado Dennes..

    o problema 1 foi resolvido...

     

    agora só preciso alterar os tipos de dados dos datasets já preenchidos..

    terça-feira, 24 de abril de 2007 03:42