Jump to content

Recommended Posts

Posted

Boas pessoal eu queria colocar um teste no botao dele onde ele testasse se um determinado registo existe num tabela da base de dados e se exestisse ele nao deixava apagar, eu sei que isso da para fazer com as relações mas eu nao queria estar a mecher nas relações da BD porque ja uma vez mexi e deu barraca xD tipo um processo que testasse que colocasse num if, pareceme simples so nao sei a instrucção SQL que deva dar

Posted

Eu tambem nao me expliquei muito bem, é assim eu tenho uma tabela empresas e uma tabela contactos a varios contactos pode estar associado uma empresa, ou seija o que eu quero testar e se no campo "Empresas" da tabela contactos existe algum contacto com o nome da empresa que estou a querer eliminar, se existir digo quais sao e nao deixo apagar se nao existir entao e eliminado com sucesso....

Posted

para isso fazes um select na tabela de contactos pelo nome da empresa

Select empresa, etc... from Contactos

where empresa = 'Nome da empresa'

se for vazio pds apagar, se não for, o retorno da query é uma  tabelas com os contactos q tem esta empresa

E fica melhor criar uma função e chamala no if ou um processo e chamalo no if? tipo

if processo ou funçao then

codigo para eleminar

else

a tal gridview com os contactos

Posted

E fica melhor criar uma função e chamala no if ou um processo e chamalo no if?

Fica melhor mas mais difícil de ler o código, mas com a vantagem de podes chamar a mesma função várias vezes em alturas diferentes, é uma boa maneira de trabalhar

Fazes:

Private Function TestaRegisto (ByVal Contatos as String) as String

' Fazes o código de testar se há contactos associados à empresa

' Se houver:

' TestaRegisto = Texto da mensagem de erro com a Lista de contactos

' Se não houver:

' TestaRegistos=""

Depois no if testas de a tua função for igual a "", podes continuar, caso contrário mensagem erro ou assim...

Ricardo Timóteo

Posted

Eu so me interesa chamar a função uma vez so achei melhor assim porque assim o codigo co botao delete ficava mais limpo e menos confuso para a minha cabeça....

Ja agora uma duvida, na função eu faço o select a tabela contactos onde o campo empresa e igual a uma variavel carregada por um campo do formulário, a minha duvida é que instrucção dar ao if?

eu tennho dim sql as string = select.....

e no if?

Posted
Private Function testedelete()
        'variaveis de ligação
        Dim strcon As String = (Contactos_Sofio.My.Settings.BDSofioConnectionString)
        Dim strsql As String = "SELECT [iD_Empresa] FROM Contactos WHERE [iD_Empresa] = '" & empID_EmpresaTextBox.Text & "'"

        'Ligação
        Dim con As New SqlConnection(strcon)
        Dim cmd As New SqlCommand(strsql, con)
        Try
            con.Open()
        Catch erro As SqlException
            MsgBox("Erro a conectar a base de dados: " & erro.Message)
        End Try
        'teste
        Dim reader As SqlDataReader = cmd.ExecuteReader()
        If reader.HasRows = 0 Then
            Return True
        Else
            Return False
        End If
        con.Close()
    End Function

Um bocadinho ali outro acula consegui construir o codigo aqui deixo para quem precisar

cumps

Posted

Se queres testar se existem ou não registos e não te interessa retorna-los, deverias ter antes algo deste genero:

    Private Function testedelete()
        'variaveis de ligação
        Dim strcon As String = (Contactos_Sofio.My.Settings.BDSofioConnectionString)

        'Ligação
        Dim con As New SqlConnection(strcon)
        Dim cmd As New SqlCommand("SELECT COUNT(1) FROM Contactos WHERE [iD_Empresa] = @Id", con)
        cmd.Parameters.Add("@Id", SqlDbType.Int, 4).Value = Integer.Parse(empID_EmpresaTextBox.Text)
        Try
            con.Open()
            If cmd.ExecuteScalar().ToString() = "0" Then
                Return True
            Else
                Return False
            End If
        Catch erro As SqlException
            MsgBox("Erro a conectar a base de dados: " & erro.Message)
        Finally
            con.Close()
            con.Dispose()
        End Try
    End Function
Posted

Se queres testar se existem ou não registos e não te interessa retorna-los, deverias ter antes algo deste genero:

    Private Function testedelete()
        'variaveis de ligação
        Dim strcon As String = (Contactos_Sofio.My.Settings.BDSofioConnectionString)

        'Ligação
        Dim con As New SqlConnection(strcon)
        Dim cmd As New SqlCommand("SELECT COUNT(1) FROM Contactos WHERE [iD_Empresa] = @Id", con)
        cmd.Parameters.Add("@Id", SqlDbType.Int, 4).Value = Integer.Parse(empID_EmpresaTextBox.Text)
        Try
            con.Open()
            If cmd.ExecuteScalar().ToString() = "0" Then
                Return True
            Else
                Return False
            End If
        Catch erro As SqlException
            MsgBox("Erro a conectar a base de dados: " & erro.Message)
        Finally
            con.Close()
            con.Dispose()
        End Try
    End Function

Estive a ver, mas nao encontrei grandes diferenças, podes explicarme?

Posted

Estive a ver, mas nao encontrei grandes diferenças, podes explicarme?

Estiveste a ver onde ? Foste ao help/msdn ou só olhaste para o código ?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method, and then performing the operations that you need to generate the single value using the data returned by a SqlDataReader.

Resumindo o método ExecuteScalar() como serve para retornar apenas um valor é mais rápido e mais eficiente do que um ExecuteReader().

Posted

Estiveste a ver onde ? Foste ao help/msdn ou só olhaste para o código ?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method, and then performing the operations that you need to generate the single value using the data returned by a SqlDataReader.

Resumindo o método ExecuteScalar() como serve para retornar apenas um valor é mais rápido e mais eficiente do que um ExecuteReader().

Olhei para o codigo nao vi grandes diferenças aparentes, mas ja percebi obrigado

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.