footboyedit Posted February 12, 2016 at 10:40 AM Report Share #593397 Posted February 12, 2016 at 10:40 AM Bom dia, estou a desenvolver um programa de funcionarios e queria fazer o eliminar só que dá-me erro porque o registo do campo funcionario já existe no campo funcionario de outra tabela. Como faço para percorrer as tabelas e se existir noutros campos não apagar? obrigado Link to comment Share on other sites More sharing options...
tiago.f Posted February 12, 2016 at 01:40 PM Report Share #593404 Posted February 12, 2016 at 01:40 PM Não seria mais simples tentares apagar e apanhar/processar o erro caso ele seja gerado? Link to comment Share on other sites More sharing options...
footboyedit Posted February 12, 2016 at 02:36 PM Author Report Share #593408 Posted February 12, 2016 at 02:36 PM Não seria mais simples tentares apagar e apanhar/processar o erro caso ele seja gerado? Era exatamente isso que eu queria. Expliquei me mal 🙂 Link to comment Share on other sites More sharing options...
tiago.f Posted February 12, 2016 at 09:45 PM Report Share #593432 Posted February 12, 2016 at 09:45 PM Então está resolvido? Link to comment Share on other sites More sharing options...
footboyedit Posted February 14, 2016 at 12:20 PM Author Report Share #593481 Posted February 14, 2016 at 12:20 PM Então está resolvido? Ainda não, como seria a melhor maneira? Link to comment Share on other sites More sharing options...
tiago.f Posted February 14, 2016 at 03:30 PM Report Share #593492 Posted February 14, 2016 at 03:30 PM No código logo após o teu query para apagar registos, tens que validar se ocorreu algum erro. Se sim, verificas se o erro devido a uma violação de chave estrangeira (foreign key). Se sim, então ignoras, já que de qualquer modo não querias apagar, e segues em frente! Link to comment Share on other sites More sharing options...
footboyedit Posted February 14, 2016 at 06:27 PM Author Report Share #593501 Posted February 14, 2016 at 06:27 PM No código logo após o teu query para apagar registos, tens que validar se ocorreu algum erro. Se sim, verificas se o erro devido a uma violação de chave estrangeira (foreign key). Se sim, então ignoras, já que de qualquer modo não querias apagar, e segues em frente! O meu problema está no código de verificaçao que tenho que usar... Link to comment Share on other sites More sharing options...
tiago.f Posted February 14, 2016 at 07:51 PM Report Share #593511 Posted February 14, 2016 at 07:51 PM Mostra o código que tens e podemos indicar-te o que acrescentar/alterar.. Link to comment Share on other sites More sharing options...
footboyedit Posted February 14, 2016 at 11:15 PM Author Report Share #593517 Posted February 14, 2016 at 11:15 PM Mostra o código que tens e podemos indicar-te o que acrescentar/alterar.. aqui está: Sub apagar() Using con As sqlConnection = getConnection() Dim query As String = "DELETE FROM Funcionario WHERE codFunc = @codFunc" Dim command As New sqlDbCommand(query, con) command.Parameters.Add("@codFunc", sqlDbType.VarChar).Value = cmbCod.Text con.Open() Dim x As Integer = command.ExecuteNonQuery() If x < 1 Then MessageBox.Show("Erro ao eliminar!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show("Eliminado com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If con.Close() command = Nothing End Using End Sub Link to comment Share on other sites More sharing options...
tiago.f Posted February 15, 2016 at 10:00 AM Report Share #593525 Posted February 15, 2016 at 10:00 AM (edited) O problema é que o comando "ExecuteNonQuery" pode/vai lançar excepções em caso de erro. Deves portanto envolve-lo num bloco try..catch (https://msdn.microsoft.com/en-us/library/fk6t46tz.aspx) e apanhar as excepções relevantes (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1) - secção "Exceptions" Diria que a excepção que deves "deixar passar" é a SqlException, mas valida Edited February 15, 2016 at 10:01 AM by tiago.f Link to comment Share on other sites More sharing options...
footboyedit Posted February 15, 2016 at 10:56 AM Author Report Share #593528 Posted February 15, 2016 at 10:56 AM (edited) O problema é que o comando "ExecuteNonQuery" pode/vai lançar excepções em caso de erro. Deves portanto envolve-lo num bloco try..catch (https://msdn.microsoft.com/en-us/library/fk6t46tz.aspx) e apanhar as excepções relevantes (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1) - secção "Exceptions" Diria que a excepção que deves "deixar passar" é a SqlException, mas valida assim? Sub apagar() Using con As sqlConnection = getConnection() Dim query As String = "DELETE FROM Funcionario WHERE codFunc = @codFunc" Dim command As New sqlDbCommand(query, con) command.Parameters.Add("@codFunc", sqlDbType.VarChar).Value = cmbCod.Text Try con.Open() Dim x As Integer = command.ExecuteNonQuery() If x < 1 Then MessageBox.Show("Erro ao eliminar!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show("Eliminado com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If Catch ex As exception MsgBox(ex.Message) Finally con.Close() command = Nothing End Try End Using End Sub Edited February 15, 2016 at 10:57 AM by footboyedit Link to comment Share on other sites More sharing options...
tiago.f Posted February 15, 2016 at 01:07 PM Report Share #593535 Posted February 15, 2016 at 01:07 PM (edited) Diria que o teu try devia ser algo do género: Try con.Open() Dim x As Integer = command.ExecuteNonQuery() If x < 1 Then MessageBox.Show("Erro ao eliminar!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show("Eliminado com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If Catch sqlex As SQLException 'Verificar se a expeção é porque o "registo do campo funcionario já existe no campo funcionario de outra tabela" 'Se for então não fazemos nada e deixamos a execução prosseguir 'Se for por outra razão qualquer então devemos tratar o erro. '(pelo que te vejo a fazer noutros sitios do codigo : MessageBox.Show("Erro ao eliminar!", etc etc Catch ex as Exception MessageBox.Show("Erro ao eliminar!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Finally con.Close() command = Nothing End Try Deves agora decidir o que pôr dentro to Catch sqlex As SQLException Edited February 15, 2016 at 01:07 PM by tiago.f Link to comment Share on other sites More sharing options...
footboyedit Posted February 15, 2016 at 02:44 PM Author Report Share #593539 Posted February 15, 2016 at 02:44 PM Diria que o teu try devia ser algo do género: Try con.Open() Dim x As Integer = command.ExecuteNonQuery() If x < 1 Then MessageBox.Show("Erro ao eliminar!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show("Eliminado com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information) End If Catch sqlex As SQLException 'Verificar se a expeção é porque o "registo do campo funcionario já existe no campo funcionario de outra tabela" 'Se for então não fazemos nada e deixamos a execução prosseguir 'Se for por outra razão qualquer então devemos tratar o erro. '(pelo que te vejo a fazer noutros sitios do codigo : MessageBox.Show("Erro ao eliminar!", etc etc Catch ex as Exception MessageBox.Show("Erro ao eliminar!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Finally con.Close() command = Nothing End Try Deves agora decidir o que pôr dentro to Catch sqlex As SQLException Como faço pra verificar se o campo funcionario em questao já existe noutra tabela (qualquer)? Link to comment Share on other sites More sharing options...
footboyedit Posted February 16, 2016 at 11:55 PM Author Report Share #593611 Posted February 16, 2016 at 11:55 PM Alguem? Link to comment Share on other sites More sharing options...
tiago.f Posted February 17, 2016 at 09:58 AM Report Share #593615 Posted February 17, 2016 at 09:58 AM (edited) Mas precisas de validar explicitamente? A tua pergunta inicial Como faço para percorrer as tabelas e se existir noutros campos não apagar? apenas indica que não queres apagar se existir. Não precisas de validar explicitamente. Se houver uma excepção do tipo SQLException, então provavelmente é porque ele não conseguiu apagar. Assim a execução entra dentro deste bloco Catch sqlex As SQLException Lá dentro podes fazer uma validação mais fina (ver qual foi a SQLException e garantir que foi mesmo devido a uma violação de foreign key) mas, para já, sugeria experimentares o código como está e ver se resolve. Se não resolver então parece-me que não estás a ser claro no problema que tens. Edited February 17, 2016 at 10:33 AM by tiago.f Link to comment Share on other sites More sharing options...
footboyedit Posted February 17, 2016 at 10:35 AM Author Report Share #593618 Posted February 17, 2016 at 10:35 AM Eu quero que apague caso não haja registo igual no campo de outra tabela. Caso haje não apague e mostre uma mensagem. Mas precisas de validar explicitamente? A tua pergunta inicial apenas indica que não queres apagar se existir. Não precisas de validar explicitamente. Se houver uma excepção do tipo SQLException, então provavelmente é porque ele não conseguiu apagar. Assim a execução entra dentro deste bloco Catch sqlex As SQLException Lá dentro podes fazer uma validação mais fina (ver qual foi a SQLException e garantir que foi mesmo devido a uma violação de foreign key) mas, para já, sugeria experimentares o código como está e ver se resolve. Se não resolver então parece-me que não estás a ser claro no problema que tens. Eu quero que apague caso não haja registo igual no campo de outra tabela. Caso haje não apague e mostre uma mensagem. Link to comment Share on other sites More sharing options...
tiago.f Posted February 17, 2016 at 10:38 AM Report Share #593619 Posted February 17, 2016 at 10:38 AM Poe lá uma mensagem dentro do bloco Catch SQLException a ver se aparece. Se não, então tens que explicar o que "registo igual no campo de outra tabela" é exactamente. (um registo é uma coisa, um campo outra) E vais ter que colocar aqui a definição das tuas tabelas, junto com a explicação. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now