2015-09-17 2 views
-1

Je souhaite lire Scope_Identity via la variable de sortie '@RoleID' d'où j'affecte la valeur de l'identité de la portée.Comment lire l'identité de l'étendue en C# à partir de la procédure stockée exécutée

C#:

private static long createNewRoleInsert(ADB.Model.RolesModel roleModelObj, MSSQL sql) 
{ 
     bool killConnection = Utils.getConnection(ref sql); 

     long returnValue = 0; 

     try 
     { 
      sql.SetSProc("[dbo].[p_Role_dfn_createNew]"); 
      sql.AddParam("@Title", roleModelObj.Title); 
      sql.AddParam("@Description", roleModelObj.Description); 
      sql.AddParam("@CreatedDate", roleModelObj.CreatedDate); 

      var RoleID = sql.ExecuteNonQuery(); 

      if(RoleID!=0 && RoleID>0) 
      { 
       returnValue = RoleID; 
      } 
     } 
     finally 
     { 
      if (killConnection) 
       sql.Dispose(); 
     } 

     return returnValue; 
    } 

procédure stockée:

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[p_Role_dfn_createNew] 
    @Title nvarchar(250), 
    @Description nvarchar(MAX) = NULL, 
    @CreatedDate DateTime, 
    @RoleID bigInt OUTPUT 
AS 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON 

    DECLARE @l_object AS SYSNAME = OBJECT_NAME(@@PROCID), 
      @l_error_msg AS NVARCHAR(2000) 

    BEGIN TRY 
    BEGIN TRAN 
    INSERT INTO [adb_TestDb].[dbo].[Role] ([Title], [Description], [CreatedDate]) 
    VALUES (@Title, @Description, @CreatedDate) 

    COMMIT TRAN 

    SET @RoleID = SCOPE_IDENTITY(); 

    RETURN @RoleID 
END TRY 
BEGIN CATCH 
    -- rollback any open/uncomitted transactions 
    IF XACT_STATE() IN (-1, 1) ROLLBACK TRANSACTION    

    -- return an error containing the object, error number and error description 
    SELECT @l_error_msg = 'Error number : ' + CAST(ERROR_NUMBER()AS VARCHAR) + '. ' + ERROR_MESSAGE()   
    RAISERROR (@l_error_msg,16,1) 
END CATCH 
+0

est 'MSSQL' un alias? –

+0

yes ............. – toxic

+0

De quelle classe est-ce un alias? c'est-à-dire quel est le type réel de 'sql'? –

Répondre

1

Le ExecuteNonQuery method ne retourne pas la valeur de retour de la procédure, elle renvoie le nombre de lignes affectées.

Pour obtenir la valeur de retour, vous devez ajouter un paramètre avec ParameterDirection.ReturnValue, mais qui ne sera pas en toute sécurité que vous obtenez la valeur @RoleID que la valeur de retour d'une procédure ne peut pas être un bigint, il est toujours un int.

Comme vous avez déjà @RoleID comme paramètre de sortie, vous devez ajouter un paramètre à la commande pour obtenir la valeur. Exemple:

SqlParameter roleIdParam = new SqlParameter("@RoleID", SqlDbType.BigInt); 
roleIdParam.Direction = ParameterDirection.Output; 

cmd.Parameters.Add(roleIdParam); 

// execute command 

long roleId = (long)roleIdParam.Value; 
0

Vous devez ajouter un paramètre de sortie en C# pour obtenir la valeur de @RoleID de la procédure stockée. Voici un exemple de ce:

using System.Data.SqlClient; 

using (SqlConnection conn = new SqlConnection("connectionString")) 
{ 
    SqlCommand cmd = conn.CreateCommand(); 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "dbo.p_Role_dfn_createNew"; 

    // add other parameters... 

    cmd.Parameters.Add(new SqlParameter("@RoleID", SqlDbType.BigInt)) 
      .Direction = ParameterDirection.Output; 
    cmd.ExecuteNonQuery(); 

    returnValue = (long)cmd.Parameters["@RoleID"].Value; 
} 
0

Modifier le

RETURN @RoleID 

à

SELECT @RoleID 

ou ajoutez le paramètre de sortie comme expliqué dans d'autres réponses