Jump to content
arned

[Resolvido] problema em apagar da base de dados

Recommended Posts

arned

Boa noite, estou a realizar um trabalho e acontece que nao estou a conseguir apagar da base de dados...

o codigo que tenho é o seguinte:


'Isto está declarado fora das sub

Public conprovide As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & My.Application.Info.DirectoryPath & "\Base de Dados.mdb;"

'################
Private Sub btnapagar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnapagar.Click
        Dim escolher As Integer

        escolher = ListBox1.SelectedValue

        Try
            Dim sqlapagar As String = "DELETE FROM Clientes WHERE ([nºcliente]=?)"

            'inicia ligação a base de dados
            Using connection As New OleDb.OleDbConnection(conprovide)

                'define o comando e os parametros
                Dim command As New OleDb.OleDbCommand(sqlapagar, connection)
                command.Parameters.Add("nºcliente", OleDb.OleDbType.Integer).Value = escolher

                'abrir ligação e insere o registo
                connection.Open()

                Dim x As Integer = command.ExecuteNonQuery()

                If x <> 1 Then
                    Throw New ArgumentException("Não foi possível eliminar o registo do Cliente da Base de dados!")
                Else : MessageBox.Show("Cliente Eliminado")

                    'remover da list box
                    ListBox1.Items.Remove(escolher)
                End If

            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

        preencherlistbox(ListBox1, "SELECT Nome FROM Clientes")

    End Sub

Acontece o seguinte, quando selecciono alguma coisa na listbox, e carrego no botao apagar, ele dá-me um erro, entra onde diz "Não foi possivel eliminar o registo do cliente da base de dados...

Alguem me pode ajudar?

Share this post


Link to post
Share on other sites
Caça

Acontece o seguinte, quando selecciono alguma coisa na listbox, e carrego no botao apagar, ele dá-me um erro, entra onde diz "Não foi possivel eliminar o registo do cliente da base de dados..."

O erro que te dá é este?

Não foi possível eliminar o registo do cliente da base de dados porque já existem registos relacionados


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Caça

O erro que te está a aparecer, é o erro que tu disparas.

O cliente que esta a tentar apagar existe?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
arned

sim, eu sei que tou a fazer ele aparecer mas é se alguma coisa nao estiver bem, como é o caso.

Pois o cliente existe e nao deixa de existir depois de executar o comando SQL...

Share this post


Link to post
Share on other sites
Caça

Substitui estas linhas

Dim sqlapagar As String = "DELETE FROM Clientes WHERE [nºcliente] = @Cliente"
command.Parameters.Add("@Cliente", OleDb.OleDbType.Integer).Value = escolher

Se o erro continuar, não é devido à sintaxe SQL.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
jpaulino

Retira o "=?" do teu comando SQL

Desta forma é que está correcto para Access :)

 


 

@arned,

O código não está a dar erro, tu é que estás a invocar um erro (o que é bem diferente).

O que está a acontecer é que não está a fazer nada ... qual é o valor da variável "escolher" ? Não será zero?

Share this post


Link to post
Share on other sites
Caça

escolher = ListBox1.SelectedValue

Sendo assim o erro só pode estar aqui


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
arned

entao mas se eu alterar o valor seleccionado da listbox ele nunca vai dar certo...

a nao ser que com o nome que é apresentado na listbox fassa um SELECT para ver o nº de cliente.. que é unico para cada um dos clientes...

mas isso eu nao sei fazer.. :S

Share this post


Link to post
Share on other sites
jpaulino

entao mas se eu alterar o valor seleccionado da listbox ele nunca vai dar certo...

Leste o meu comentário? Qual é o valor da variável quando vais utilizar no parameter?

Share this post


Link to post
Share on other sites
arned

o valor da variavel escolher é o listbox.selectedvalue...

mas agora que estou a pensar...

pode ser zero sim... porque eu antes estava a prencher a listbox com o databinding(logo ele ia buscar o valor que era o nºcliente) mas agora criei uma função para a preencher atravez da base de dados..

Só que assim nao tem o selected value...

tinha pensado em fazer uma função para procurar na base de dados pelo nome igual ao que selecciono na listbox e depois ela retornava o nºcliente...

só que estou com algumas dificuldades... :X

Share this post


Link to post
Share on other sites
jpaulino

Mas já experimentaste em ver o valor ou não sabes fazer isso? Só tens de colocar um breakpoint no código e verificar o valor antes de utilizares.

Share this post


Link to post
Share on other sites
arned

sim, já tentei... e nao estou a conseguir arranjar solução..

Decidi fazer uma função para pesquisar na base de dados e para me retornar o nºcliente.

Assim, meto uma message box, com todas as informações desse cliente, para ter a certesa do cliente que quer apagar.

se meter sim, apaga..

Agora já fiz a string sql, que é simples... estou agora a tentar fazer a pesquisa na base de dados.

Share this post


Link to post
Share on other sites
jpaulino

sim, já tentei... e nao estou a conseguir arranjar solução..

Decidi fazer uma função para pesquisar na base de dados e para me retornar o nºcliente.

Assim, meto uma message box, com todas as informações desse cliente, para ter a certesa do cliente que quer apagar.

se meter sim, apaga..

Agora já fiz a string sql, que é simples... estou agora a tentar fazer a pesquisa na base de dados.

Já experimentaste em vez de colocar o valor que vem da listview, colocares um número (id) que saibas que existe? É que o problema deve ser da forma como preenches a listbox (que não te guarda os valores).

Não te esqueças que podes ter dois nomes iguais e dessa forma como queres também não vai funcionar :P  

Share this post


Link to post
Share on other sites
arned

pois... entao, em vez de adicionar a listbox só o nome do cliente, adiciono tambem o numero de cliente é isso?

é que eu quando preencho a listbox so estou a meter os nomes....

não sei como fazer para adicionar o nºcliente como value da listbox... nem sei se dá para fazer isso..

Share this post


Link to post
Share on other sites
Caça

Só tens de definir o DataSource da Listbox e indicar o nome do campo que irá ser o valor e o nome do campo que ira ser mostrado


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
ribeiro55

Como é que estás a alimentar a ListBox?

Sem binds, basta-te desenhar uma pequena structure para guardares o ID e mais outros valores relevantes, juntamente com a string que queres que seja mostrada.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
arned

eu tentei fazer isso mas nao estava a funcionar, entao resolvi fazer o seguinte, ao lado da listbox com os nomes dos clientes, coloquei outra listbox mas esta só com o nºcliente, assim sempre que seleccionar um nome, ele selecciona automaticamente o nºcliente e é muito mais facil..

Agora, outro problema, ao adicionar a list box, como é um numero inteiro nao vale a pena meter em string, logo mudei o codigo da primeira list box e ficou o seguinte:

    Private Sub preencherlistbox2(ByVal lst As ListBox, ByVal query As String)

        '############ PREENCHER LISTBOX 2 (NºCLIENTES)
        Dim sql1 As String = "SELECT nºcliente FROM Clientes"

        'Iniciar ligação a base de dados
        Using connection As New OleDb.OleDbConnection(conprovide)

            'Define o comando e os parametros
            Dim command As New OleDb.OleDbCommand(sql1, connection)

            'abre conexao
            connection.Open()

            'cria um comando select
            Dim cmd As New OleDb.OleDbCommand(query, connection)

            'executa a consulta
            Dim db_reader As OleDb.OleDbDataReader = cmd.ExecuteReader(CommandBehavior.Default)

            'exibe os resultados
            Dim numero As Integer
            Dim i As Integer

            Do While db_reader.Read
                numero = db_reader.Item(0)
                For i = 1 To db_reader.FieldCount - 1
                    numero &= vbTab & db_reader.Item(i)
                Next i
                ListBox2.Items.Add(numero)
            Loop


        End Using
    End Sub

Penso que tenho um erro ou varios, no db_Reader... mas nao sei como mudar...

Share this post


Link to post
Share on other sites
ribeiro55

eu tentei fazer isso mas nao estava a funcionar, entao resolvi fazer o seguinte, ao lado da listbox com os nomes dos clientes, coloquei outra listbox mas esta só com o nºcliente, assim sempre que seleccionar um nome, ele selecciona automaticamente o nºcliente e é muito mais facil..

Não, é infernalmente incorrecto :)

Basta-te criar, na classe do form, uma structure parecida com:

    Private Structure ItemLB
        Public Valor As String 'não sei se tens identidades compostas ou apenas numéricas
        Public Texto As String

        Public Overrides Function ToString() As String
            Return Texto
        End Function
    End Structure

E no local onde carregas os dados, fazes com que a query também traga o nome do cliente e adicionas a uma listbox apenas não o texto, mas a structure:

Dim ILB As New ItemLB
ILB.Valor = "numero do cliente"
ILB.Texto = "nome do cliente"
ListBox1.Items.Add(ILB)

O override ao ToString que a structure prevê garante-te que a listbox vai apresentar o nome do cliente.

Para apanhares os valores, é tão simples como consultares as variáveis da classe, convertendo-a previamente (não esqueçamos que a listbox mantém "colecções" de object):

'para apanhar o nome do cliente seleccionado na listbox

CType(Listbox1.SelectedItem,ItemLB).Texto

'para apanhar o número do cliente seleccionado na listbox

CType(Listbox1.SelectedItem,ItemLB).Valor

Não é complicado. É muito mais simples do que manter duas listbox... e se quisesses armazenar mil valores? Fazias mil listbox? :D


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Caça

Também podes preencher a ListBox assim:

        Dim sql1 As String = "SELECT nºcliente, Nome FROM Clientes"
        Dim Dt As New DataTable
        Using connection As New OleDb.OleDbConnection(conprovide)
            connection.Open()
            Dim cmd As New OleDb.OleDbCommand(sql1, connection)
            Dim Da As New OleDb.OleDbDataAdapter(cmd)
            Da.Fill(Dt)
            connection.Close()
        End Using
        ListBox2.DataSource = Dt
        ListBox2.ValueMember = "nºcliente"
        ListBox2.DisplayMember = "Nome"


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
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.