Jump to content

Apagar registos SQL Server


footboyedit

Recommended Posts

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

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

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 by tiago.f
Link to comment
Share on other sites

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 by footboyedit
Link to comment
Share on other sites

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 by tiago.f
Link to comment
Share on other sites

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

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 by tiago.f
Link to comment
Share on other sites

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.