none
System.InvalidOperationException no OleDbCommandBuilder.GetUpdateCommand RRS feed

  • Pergunta

  • Olá...

    Estou com um problema para utilizar o GetUpdateCommand do OleDbCommandBuilder. Abaixo está o código:

     

    cmd.Connection = cn

    cmd.CommandType = CommandType.Text

    cmd.CommandText = "SELECT NumAnunciador,NumPonto,Status from ponto where NomeProjeto=@NomeProjeto"

    cmd.Parameters.Add(New OleDbParameter("@NomeProjeto", OleDbType.Char, 50))

    cmd.Parameters("@NomeProjeto").Value = ProjetoAtual.NomeProjeto

    AdptBDMAUELL.SelectCommand = cmd

    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(AdptBDMAUELL)

    AdptBDMAUELL.UpdateCommand = builder.GetUpdateCommand()

    AdptBDMAUELL.Update(dsStatusPt, "status")

     

    Quando executo a linha "AdptBDMAUELL.UpdateCommand = builder.GetUpdateCommand()" gera uma excessão System.InvalidOperationException informando que não há suporte para geração SQL dinâmica de UpdateCommand em SelectCommand que não retorna informações sobre uma coluna de chaves. O banco de dados que estou tentando utilizar é o MSAccess 2003. Detalhe, com o mesmo código utilizando o MySQL ou o SQL Server, funciona perfeitamente... Lembrando que o OleDbCommand e o OleDbConnection já foram instanciados anteriormente.

    O que pode estar faltando?

    Se alguem puder me ajudar...

     

    []'s

     

    quarta-feira, 18 de abril de 2007 19:51

Respostas

Todas as Respostas

  • No SelectCommand você deve trazer o(s) campo(s) que faz parte da chave primária da tabela. Algum desses campos (NumAnunciador, NumPonto, Status) fazem parte?
    quarta-feira, 18 de abril de 2007 20:01
  • Olá Leonardo...

    muito obrigado pela resposta....

     

    Então, a tabela ponto possui os seguintes campos: NomeProjeto (PK), NumAnunciador (PK), NumPonto (PK), TagPonto, DescricaoPonto, Status.

    Sendo assim inclui no select o campo que faltava para ter todas as chaves primarias (NomeProjeto). O código ficou assim:

     

    cmd.Connection = cn

    cmd.Parameters.Clear()

    cmd.CommandType = CommandType.Text

    cmd.CommandText = "SELECT NomeProjeto,NumAnunciador,NumPonto,Status from ponto where NomeProjeto=@NomeProjeto"

    cmd.Parameters.Add(New OleDbParameter("@NomeProjeto", OleDbType.Char, 50))

    cmd.Parameters("@NomeProjeto").Value = ProjetoAtual.NomeProjeto

    AdptBDMAUELL.SelectCommand = cmd

    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(AdptBDMAUELL)

    AdptBDMAUELL.UpdateCommand = builder.GetUpdateCommand()

    AdptBDMAUELL.Update(dsStatusPt, "status")

     

    O erro que ocorria antes parou de acontecer... porém agora está gerando erro na ultima linha. O erro que aconteceu primeiro era um System.InvalidOparationException, e a descrição é: DataColumn 'NomeProjeto' em DataTable 'status' de SourceCollumn 'NomeProjeto' inexistente.... ai lembrei que também deveria alterar o meu schema do dataset incluindo os campos... ai o erro mudou nesta linha: System.Data.DBConcurrencyException: Violação de concorrencia. UpdateCommand afetou 0 registro...

    Agora parei neste ponto... não sei o q pode estar acontecendo, sendo que como falei antes funcionava no mysql e no ms-sqlserver...

     

    Pode me ajudar?

     

     

     

     

    quarta-feira, 18 de abril de 2007 20:26
  • Tente assim:

     

    cmd.Connection = cn

    cmd.Parameters.Clear()

    cmd.CommandType = CommandType.Text

    cmd.CommandText = "SELECT NomeProjeto,NumAnunciador,NumPonto,Status from ponto where NomeProjeto=@NomeProjeto"

    cmd.Parameters.Add(New OleDbParameter("@NomeProjeto", OleDbType.Char, 50))

    cmd.Parameters("@NomeProjeto").Value = ProjetoAtual.NomeProjeto

     

    AdptBDMAUELL = New OleDbDataAdapter(cmd)

     

    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(AdptBDMAUELL)

     

    AdptBDMAUELL.Update(dsStatusPt.GetChanges())

     

    Veja se dá o mesmo erro.
    quarta-feira, 18 de abril de 2007 20:37
  • Leonardo,

    agora aconteceu outro erro do tipo System.InvalidOperationException na ultima linha. O detalhe do erro é "A atualização não pode encontrar TableMapping['Table'] ou DataTable 'Table'....

    quarta-feira, 18 de abril de 2007 20:48
  • Me diz uma coisa: Antes do update, você não chama o método Fill do DataAdapter? Pra que está atualizando algo que nem tem dado ainda?

     

    Teria que ser assim:

     

    cmd.Connection = cn

    cmd.Parameters.Clear()

    cmd.CommandType = CommandType.Text

    cmd.CommandText = "SELECT NomeProjeto,NumAnunciador,NumPonto,Status from ponto where NomeProjeto=@NomeProjeto"

    cmd.Parameters.Add(New OleDbParameter("@NomeProjeto", OleDbType.Char, 50))

    cmd.Parameters("@NomeProjeto").Value = ProjetoAtual.NomeProjeto

     

    AdptBDMAUELL = New OleDbDataAdapter(cmd)

     

    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(AdptBDMAUELL)

     

    AdptBDMAUELL.Fill(dsStatusPt, "status")

     

    'Faz as operações aqui ...

     

    'E depois atualiza.

    AdptBDMAUELL.Update(dsStatusPt.GetChanges())

     

     

    quarta-feira, 18 de abril de 2007 20:55
  • eu chamo o objeto Fill em outro método... o outro método está assim:

     

    Public Function fcObterPontos()

    Try

    dsStatusPt.Clear()

    cmd.Connection = cn

    cmd.Parameters.Clear()

    cmd.CommandType = CommandType.Text

    cmd.CommandText = "SELECT NumAnunciador,NumPonto,Status from ponto where NomeProjeto=@NomeProjeto"

    cmd.Parameters.Add(New OleDbParameter("@NomeProjeto", OleDbType.Char, 50))

    cmd.Parameters("@NomeProjeto").Value = ProjetoAtual.NomeProjeto

    AdptBDMAUELL.SelectCommand = cmd

    AdptBDMAUELL.Fill(dsStatusPt, "status")

    Return True

    Catch ex As Exception

    Return False

    End Try

    End Function

     

     Estas funções estão em uma classe... eu altero o dataset através de uma thread... na thread obtenho os dados atraves desta função, faço as alterações, e atualizo com o update... de qualquer forma coloquei o Fill antes do update para ver se também dava erro de concorrencia, mas o erro não aconteceu no fill, apenas no update...

    talvez não esteja faltando o comando acceptchanges??

    quarta-feira, 18 de abril de 2007 21:09
  • então...

    eu coloquei o AcceptChanges antes de chamar o Update, e o comando agora é executado sem gerar erros...

    Porém ele não me atualiza a tabela, já que assim o RowState é alterado de Modified para Unchanged...

     

    quarta-feira, 18 de abril de 2007 21:24
  • Faça um teste. Crie um método chamado teste e chame SOMENTE ele. Coloque o codigo abaixo:

     

    cmd.Connection = cn

    cmd.Parameters.Clear()

    cmd.CommandType = CommandType.Text

    cmd.CommandText = "SELECT NomeProjeto,NumAnunciador,NumPonto,Status from ponto where NomeProjeto=@NomeProjeto"

    cmd.Parameters.Add(New OleDbParameter("@NomeProjeto", OleDbType.Char, 50))

    cmd.Parameters("@NomeProjeto").Value = ProjetoAtual.NomeProjeto

     

    AdptBDMAUELL = New OleDbDataAdapter(cmd)

     

    Dim builder As OleDbCommandBuilder = New OleDbCommandBuilder(AdptBDMAUELL)

     

    AdptBDMAUELL.Fill(dsStatusPt, "status")

     

    dsStatusPt.Tables("status").rows(0)("Status") = AlgumValor

     

    AdptBDMAUELL.Update(dsStatusPt.GetChanges())

     

    dsStatusPt.Acceptchanges()

    quarta-feira, 18 de abril de 2007 22:44
  • Olá Leonardo,

     

    então... descobri o erro que era... é q no método ObterDados eu esqueci de incluir o campo NomeProjeto q tinha adicionado no método Update... falha minha... ... desta forma não gerou mais nenhum erro... de qualquer forma, o access ficou muuuuuiiittooo lento... não deu certo... vou ter q tentar resolver os problemas que estava tendo no mysql, que estava funcionando, ou então procurar outro banco de dados... No mysql, qto mais eu passava na função Update, mais lento o comando ficava.... tem alguma idéia do que poderia ser? Tem alguma outra sugestão de banco de dados ? O MSDE permite multiplos usuários?

     

    Muito obrigado pela sua ajuda...

    quinta-feira, 19 de abril de 2007 11:57
  • quinta-feira, 19 de abril de 2007 13:03