2014-06-06 3 views
0

Idéalement, j'essaie d'obtenir une procédure stockée pour renvoyer 1 si existe ou 0 sinon.Procédure stockée SQL Server si elle existe

Ceci est la procédure stockée:

CREATE PROCEDURE [dbo].[spCheckForExistingTimecard] 
    @userId int, 
    @paYPeriodId int, 
    @exists bit = 0 OUTPUT 
AS 
BEGIN 
    IF EXISTS (SELECT COUNT (t.TimeCardId) 
       FROM TimeCard AS t 
       WHERE t.PayPeriodId = @payPeriodId 
       AND t.UserId = @userId) 
     RETURN 1 
    ELSE 
     RETURN 0 

Voici le code appelant la procédure stockée:

public static int CheckForExistingTimecard(int userId, int payPeriodId) 
{ 
     using (SqlConnection connection = new SqlConnection(dbMaintenanceConnectionString)) 
     { 
      connection.Open(); 

      using (SqlCommand sqlCommand = new SqlCommand("spCheckForExistingTimecard", connection)) 
      { 
       sqlCommand.CommandType = CommandType.StoredProcedure; 
       sqlCommand.Parameters.AddWithValue("@userId", userId); 
       sqlCommand.Parameters.AddWithValue("@payPeriodId", payPeriodId); 
       return (int)sqlCommand.ExecuteScalar(); 
      } 
     } 
    } 

Le problème est que je reçois une erreur

référence d'objet non définie à une instance d'un objet

sur la ligne de retour du code appelant.

Toute aide serait grandement appréciée

Répondre

1

Comme documeneted dans le site officeil

La première colonne de la première ligne du jeu de résultats, ou une référence null (Nothing en Visual Basic) si le le jeu de résultats est vide. Renvoie un maximum de 2033 caractères.

ExecuteScalar renvoie null si aucun enregistrement ont été retournés par la requête

donc cette ligne:

retour (int) sqlCommand.ExecuteScalar();

lancers francs erreur

becaue il tente de jeter nulle en entier, dans ce cas. Cela va déclencher une exception NullReferenceException.

vous devez vérifier null:

object o = sqlCommand.ExecuteScalar(); 
item = o == null ? 0 : (int)o; 
1

La valeur de RETURN peut être gérée par un SqlParameter avec un .Direction = ParameterDirection.ReturnValue. La valeur que .ExecuteScalar() va attraper est une seule ligne, une seule colonne renvoyée par un SELECT dans votre procédure stockée.

public static int CheckForExistingTimecard(int userId, int payPeriodId) 
{ 
    using (SqlConnection connection = new SqlConnection(dbMaintenanceConnectionString)) 
    using (SqlCommand sqlCommand = new SqlCommand("spCheckForExistingTimecard", connection)) 
    { 
     sqlCommand.CommandType = CommandType.StoredProcedure; 
     sqlCommand.Parameters.AddWithValue("@userId", userId); 
     sqlCommand.Parameters.AddWithValue("@payPeriodId", payPeriodId); 

     -- define your parameter for the RETURN value 
     sqlCommand.Parameters.Add("@ReturnValue").Direction = ParameterDirection.ReturnValue; 

     connection.Open(); 
     sqlCommand.ExecuteNonQuery(); 

     -- read the value returned 
     int returnValue = (int)sqlCommand.Parameters["@ReturnValue"]; 

     connection.Close(); 

     return returnValue; 
    } 
} 
Questions connexes