Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Errore nel prelevare ID

    Salve a tutti...ho un problema che non riesco a risolvere,in pratica questo è il mio codice con cui inserisco dati in una tabella collegata ad un altra in relazione uno a molti.

    Il problema è l errata gestione dell ID,e spero qualcuno possa risolvere i miei dubbi

    L id nella tabella editori è una var autoincrementante,mentre quella dei libri è testuale

    In pratica il risultato dell id mi vale sempre 0 e non capisco dove sia l errore.Ho commentato il codice quindi dovrebbe essere molto chiaro ...grazie


    codice:
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim last_id As Object
            Dim con_string As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\prova.mdb"
    
            ' Apro una connessione col database
            Dim conn_contab As New OleDb.OleDbConnection(con_string)
            conn_contab.Open()
    
            ' Operazione di INSERT di un nuovo editore
            Dim cmd As New OleDbCommand( _
            "INSERT INTO editori (nome) " & _
            "VALUES (?)", _
            conn_contab)
    
            cmd.Parameters.Add(New OleDbParameter("nome", TextBox1.Text))
    
            ' Prelevo l ID dell editore inserito
            Dim preleva_id As New OleDbCommand( _
           "SELECT @@identity from editori", conn_contab)
    
            preleva_id.CommandType = CommandType.Text
            last_id = preleva_id.ExecuteScalar()
            MsgBox(last_id)
    
            ' Operazione di INSERT di un nuovo libro con ID editore aggiornato
            Dim cmd2 As New OleDbCommand( _
            "INSERT INTO libri (isbn,titolo,id_editore) " & _
            "VALUES (?,?,?)", _
            conn_contab)
    
            cmd2.Parameters.Add(New OleDbParameter("isbn", TextBox2.Text))
            cmd2.Parameters.Add(New OleDbParameter("titolo", TextBox3.Text))
            cmd2.Parameters.Add(New OleDbParameter("id_editore", last_id))
    
            ' Eccezioni
            Try
                cmd.ExecuteNonQuery()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
            ' Salva 
            Me.Validate()
            Me.EditoriBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.ProvaDataSet)
    
            'Svuota le caselle di testo
            TextBox1.Text = ""
            TextBox2.Text = ""
            TextBox3.Text = ""
    
            ' Chiudi la connessione
            conn_contab.Close()
            conn_contab.Dispose()
    
            'Refresh dei DataGridView 
            Me.EditoriTableAdapter.Fill(Me.ProvaDataSet.editori)
            Me.LibriTableAdapter.Fill(Me.ProvaDataSet.libri)
            Me.JoinTableAdapter.Fill(Me.ProvaDataSet.join)
    
            'Fa ripartire la combobox a valore nullo
            ComboBox1.SelectedIndex = -1

  2. #2
    Ma non l'avevamo già risolto sto problema? :master:

  3. #3
    Ehm no le tabelle sono rimaste uguali ma l esempio è diverso...nel caso precedente(che hai risolto tu ) volevo inserire un libro dato un editore esistente.In questo invece devo inserirne uno nuovo non presente nella tabella

    Nel precedente esempio poi,l associazione tra valore e tabella la faceva in automatico vb.net via binding source mentre in questo caso (è puramente didattico) vorrei capire come funziona il meccanisco degli id via codice e senza wizard

    Purtroppo dato che l altro problema aveva le stesse tabelle e l avevi risolto,ti sembra molto familiare

  4. #4
    Alla fine ho risolto leggendo su un forum inglese

    "My guess is that you actually have two seperate operations going on. Even
    though the transaction is the same it's no longer in the same scope. A scope
    has a much shorter lifespan. Your best bet is to actually try to do your
    insert operation, or whatever is being performed in the ExecuteNonQuery, and
    select the @@Identity value at the same time, otherwise they won't be
    considered as being in the same scope"

    Quindi seguendo tale consiglio , l operazione di esecuzione della query di inserimento, e quella di calcolo dell @@identity vanno fatte assieme,altrimenti è come se agissero su ambiti differenti,ed è per questo che mi restituiva continuamente 0 il last_id

    spero a qualcuno possa tornare utile

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.