2010-06-01 5 views
3

Comment exécuter une procédure stockée avec un paramètre nullable dans C#?.net: Comment exécuter une procédure stockée avec un paramètre nullable dans C#?

EDIT:

En fait, je l'ai écrit ci-dessous le code. Comme vous pouvez le voir, le paramètre status est un type de valeur Nullable. Est-ce correct? ou pas?

public void LoadAll(DataTable tb, int? status=null) 
    { 
     try 
     { 
      using (SqlConnection connection = new SqlConnection()) 
      { 
       connection.ConnectionString = this.connectionString; 

       using (SqlCommand command = connection.CreateCommand()) 
       { 
        command.CommandType = CommandType.StoredProcedure; 
        command.CommandText = "USP_OrganizationChartSelect"; 
        SqlCommandBuilder.DeriveParameters(command); 
        command.Parameters["@Status"].Value = status.HasValue ? status : null; 
        if (connection.State != ConnectionState.Open) 
         connection.Open(); 
        SqlDataAdapter adapter = new SqlDataAdapter(command); 
        tb.Clear(); 
        adapter.Fill(tb); 
        adapter.Dispose(); 
        adapter = null; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

Merci

+1

Nous avons besoin d'un peu plus de détails ici: quel serveur de base de données? –

+0

@jeremy: bien, SQL Server – odiseh

+0

Vous devriez aussi mettre un 'using()' autour de votre adaptateur de données. –

Répondre

0

Si le paramètre est annulable, il doit être un type de valeur. Supposons que vous ayez un paramètre int nullable, alors vous pouvez passer cette façon ..

int? nullableParam = null; 
    nullableParam = 10; //set the value if any 
    //Pass nullableParam to your sp call. 
+2

utilise la méthode GetValueOrDefault de l'objet nullable ou sa valeur par défaut. – VoodooChild

+0

+1 Bon point :) – odiseh

+0

Valeur par défaut pour un int = 0 pas ce que nous avons suggéré (null) – odiseh

0

vous pouvez vérifier la valeur nullable dans votre sp comme ci-dessous:

select * from table 
where (code = @code or @code is null) 

par cette solution si @code être null alors cette condition ne s'appliquera pas.

+0

Je l'ai fait dans mon SP. – odiseh

+0

Une manière plus claire de le faire est: 'où code = ISNULL (@code, code)' Si votre paramètre est null, il utilise la valeur de la colonne elle-même pour la comparaison. –

4

Vous pouvez essayer DBNull.Value au lieu de null ou omettre le paramètre lorsque le nullable n'a aucune valeur entièrement.

+0

vous voulez dire que je devrais mettre Deriveparameter dans un bloc if? – odiseh

+0

Je n'ai pas fait beaucoup de travail avec SqlCommand et Datasets mais je suggérerais d'essayer le test if comme: if (status.HasValue) {command.Parameters ["@ Status"]. Value = status} – eddiegroves

+0

ce que vous avez suggéré (en utilisant DBNull.value) génère une erreur indiquant qu'il n'y a pas de conversion implicite entre int? et DBNull, – odiseh

Questions connexes