Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 13 su 13
  1. #11
    Originariamente inviato da djciko
    quindi @@IDENTITY è più 'costosa' ?
    Non centra il costo.
    Ti ho indicato due esempi per farti capire come una variabile "locale" ad un certo ambito, è visibile e quindi modificabile solo all'interno di esso. SCOPE_IDENTITY è locale alla stored procedure in cui la usi, @@IDENTITY è visibile e quindi modificabile anche da fuori della tua stored procedure. Quindi, se fai un insert e subito dopo qualcuno esegue un altro insert condiziona la variabile @@IDENTITY e quindi quando tu la vai a leggere ti puoi ritrovare con un valore diverso da quello che ti aspetti.
    Saluti a tutti
    Riccardo

  2. #12
    Originariamente inviato da riccardone
    forse sbagli solo ad assegnare il valore al parametro.
    Prova con
    SELECT @IDNew = SCOPE_IDENTITY()
    oppure a leggere il parametro. In ogni caso ecco uno script sql che fa quello che dici tu e di seguito il codice c# di esempio che legge il parametro

    USE [AdventureWorks]
    GO
    CREATE TABLE [dbo].[test](
    [ContactID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [FirstName] [dbo].[Name] NOT NULL,
    [LastName] [dbo].[Name] NOT NULL,
    CONSTRAINT [PK_test_ContactID] PRIMARY KEY CLUSTERED
    (
    [ContactID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    go
    CREATE TABLE [dbo].[testdetails](
    [ContactID] [int] NOT NULL,
    [details] [dbo].[Name] NOT NULL) ON [PRIMARY]
    GO
    CREATE PROCEDURE dbo.InsertTest
    @FirstName varchar(50),
    @LastName varchar(50),
    @IDNew int OUTPUT
    AS
    BEGIN
    SET NOCOUNT ON;
    INSERT INTO [AdventureWorks].[dbo].[test]
    ([FirstName]
    ,[LastName])
    VALUES
    (@FirstName
    ,@LastName)
    SELECT @IDNew = SCOPE_IDENTITY()
    INSERT INTO [AdventureWorks].[dbo].[testdetails]
    ([ContactID]
    ,[details])
    VALUES
    (@IDNew
    ,'UFFA perche qui funziona e li no...')
    END
    GO


    string connstr = @"Data Source=localhost;Initial Catalog=AdventureWorks;Integrated Security=True";
    using (SqlConnection conn = new SqlConnection(connstr))
    {
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("InsertTest", conn))
    {
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    SqlParameter pId = new SqlParameter("@IDNew", System.Data.SqlDbType.Int);
    pId.Direction = System.Data.ParameterDirection.Output;
    cmd.Parameters.Add("@FirstName", System.Data.SqlDbType.VarChar).Value = "gigi";
    cmd.Parameters.Add("@LastName", System.Data.SqlDbType.VarChar).Value = "dalessio";
    cmd.Parameters.Add(pId);
    int res = cmd.ExecuteNonQuery();
    int id = (int)cmd.Parameters["@IDNew"].Value;
    }
    }
    Saluti a tutti
    Riccardo

  3. #13
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Originariamente inviato da riccardone
    Non centra il costo.
    Ti ho indicato due esempi per farti capire come una variabile "locale" ad un certo ambito, è visibile e quindi modificabile solo all'interno di esso. SCOPE_IDENTITY è locale alla stored procedure in cui la usi, @@IDENTITY è visibile e quindi modificabile anche da fuori della tua stored procedure. Quindi, se fai un insert e subito dopo qualcuno esegue un altro insert condiziona la variabile @@IDENTITY e quindi quando tu la vai a leggere ti puoi ritrovare con un valore diverso da quello che ti aspetti.
    ok, capito. grazie

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 © 2026 vBulletin Solutions, Inc. All rights reserved.