Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072

    Stored procedure e recupero ID record salvato

    Cosa sbaglio?? perchè non ottengo l'ID del record creato...


    if (IDAzienda == 0) //Creazione di un nuovo elemento
    {
    IDAzienda = Helper.DataHelper.AddAnagrafica(sqlConnection,
    IDTipologia,
    IDRegioneSegnalatore,
    Convert.ToInt32(IDSegnalatore),
    Convert.ToInt32(IDOwner),
    Convert.ToInt32(IDCanale),


    dove il metodo è:

    public Int32 AddAnagrafica(SqlConnection connection,
    ....)
    {
    ConnectionState currState = connection.State;
    if (((connection.State & ConnectionState.Open) != ConnectionState.Open))
    connection.Open();
    try
    {
    SqlParameter[] parameters = new SqlParameter[7];
    ...
    parameters[6] = new SqlParameter("@IDNew", SqlDbType.Int);
    parameters[6].Direction = ParameterDirection.Output;
    SqlCommand cmd = CreateStoreProcedureCommand("AddAnagrafica", connection, parameters);

    if (cmd.ExecuteNonQuery() == 1)
    {
    return (Int32)cmd.Parameters["@IDNew"].Value;
    }
    else
    {
    return 0;
    }

    }
    finally
    {
    if ((currState == ConnectionState.Closed))
    connection.Close();
    }


    e la SP


    ALTER PROCEDURE [dbo].[AddAnagrafica]
    (
    @IDTipologia varchar(1),
    @IDSegnalatore int,
    @IDOwner int,
    @IDCanale int,
    ....
    @IDNew int OUTPUT
    )
    AS

    INSERT INTO Anagrafica (
    ....)
    VALUES
    (....
    )


    SET @IDNew = SCOPE_IDENTITY()

    INSERT INTO AnagraficaDettaglio(
    IDAnagrafica,
    ....)

    VALUES
    (@IDNew,
    ....)
    RETURN

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    C'e' una variabile d'ambiente che mi pare si chiami @@IDENTITY...

    trovata:
    http://technet.microsoft.com/it-it/l.../ms187342.aspx

  3. #3
    E' piu' corretto usare la funzione SCOPE_IDENTITY(), rispetto a @@IDENTITY, perchè riduce il suo campo d'azione al batch in cui è eseguita.
    Detto questo, non mi è chiaro se il secondo insert che fai va a buon fine. Cioè, riesci a impostare il valore nella variabile?
    In ogni caso, invece di fare una unica sp che fa due inserimenti ne farei una per ogni singola operazione. La prima sp invece di valorizzare un parametro, fai in modo che ritorni il valore della funzione SCOPE_IDENTITY()
    es.
    create sp......
    as
    ..
    insert ....
    SELECT SCOPE_IDENTITY()

    se hai bisogno di eseguire il tutto in una transazione puoi utilizzare un sp che richiama le due precedenti all'interno di una transazione.
    Saluti a tutti
    Riccardo

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Originariamente inviato da riccardone
    E' piu' corretto usare la funzione SCOPE_IDENTITY(), rispetto a @@IDENTITY, perchè riduce il suo campo d'azione al batch in cui è eseguita.
    A questo punto mi interessa saperne di più, che significa ?

  5. #5
    copio e incollo dal link che tu stesso hai postato

    ----------------------
    Le funzioni @@IDENTITY e SCOPE_IDENTITY restituiscono l'ultimo valore Identity generato in una tabella durante la sessione corrente. La funzione SCOPE_IDENTITY tuttavia restituisce il valore solo all'interno dell'ambito corrente, mentre la funzione @@IDENTITY non è limitata a un ambito specifico.
    ----------------------

    l'ambito nel caso in questione è la stored procedure.
    Saluti a tutti
    Riccardo

  6. #6
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Originariamente inviato da riccardone
    copio e incollo dal link che tu stesso hai postato

    ----------------------
    Le funzioni @@IDENTITY e SCOPE_IDENTITY restituiscono l'ultimo valore Identity generato in una tabella durante la sessione corrente. La funzione SCOPE_IDENTITY tuttavia restituisce il valore solo all'interno dell'ambito corrente, mentre la funzione @@IDENTITY non è limitata a un ambito specifico.
    ----------------------

    l'ambito nel caso in questione è la stored procedure.
    l'avevo letto, ma non mi è chiaro cosa si intende per 'ambito' ...

  7. #7
    ambito = scopo
    se scrivi in una finestra di query

    GO -- inizio di un batch
    DECLARE @ciccio int
    SET @ciccio = 10
    GO -- fine di un batch
    PRINT @ciccio -- questa istruzione genera errore perchè la variabile non è più visibile

    per lo stesso motivo

    create procedure ....... -- inizio scopo
    as
    -- codice stored
    GO -- fine scopo le variabili locali vengono eliminate
    Saluti a tutti
    Riccardo

  8. #8
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Originariamente inviato da riccardone
    ambito = scopo
    se scrivi in una finestra di query

    GO -- inizio di un batch
    DECLARE @ciccio int
    SET @ciccio = 10
    GO -- fine di un batch
    PRINT @ciccio -- questa istruzione genera errore perchè la variabile non è più visibile

    per lo stesso motivo

    create procedure ....... -- inizio scopo
    as
    -- codice stored
    GO -- fine scopo le variabili locali vengono eliminate
    quindi @@IDENTITY è più 'costosa' ?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    3,072
    Originariamente inviato da riccardone
    E' piu' corretto usare la funzione SCOPE_IDENTITY(), rispetto a @@IDENTITY, perchè riduce il suo campo d'azione al batch in cui è eseguita.
    Detto questo, non mi è chiaro se il secondo insert che fai va a buon fine. Cioè, riesci a impostare il valore nella variabile?
    In ogni caso, invece di fare una unica sp che fa due inserimenti ne farei una per ogni singola operazione. La prima sp invece di valorizzare un parametro, fai in modo che ritorni il valore della funzione SCOPE_IDENTITY()
    es.
    create sp......
    as
    ..
    insert ....
    SELECT SCOPE_IDENTITY()

    se hai bisogno di eseguire il tutto in una transazione puoi utilizzare un sp che richiama le due precedenti all'interno di una transazione.
    Il secondo insert va a buon fine!

    Quindi cosa sbaglio?

    Thanks

  10. #10
    Originariamente inviato da Valeria75_bis
    Il secondo insert va a buon fine!
    Quindi cosa sbaglio?
    forse sbagli solo ad assegnare il valore al parametro.
    Prova con
    SELECT @IDNew = SCOPE_IDENTITY()
    Saluti a tutti
    Riccardo

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.