Usuário com melhor resposta
System.InvalidOperationException no OleDbCommandBuilder.GetUpdateCommand

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
Respostas
Todas as Respostas
-
-
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?
-
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())
-
-
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())
-
eu chamo o objeto Fill em outro método... o outro método está assim:
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 FunctionEstas 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??
-
-
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()
-
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...
-