2009-07-22 6 views
4

J'essaie de déterminer comment spécifier null comme valeur de paramètre dans OracleCommand en utilisant le code C# suivant. J'ai extrait les bits pertinents, mais fondamentalement le point est que si sal_id arrive avec la valeur 0, il doit être stocké comme nul. J'ai essayé Null, "Null", et quelques autres choses mais jusqu'ici pas de chance.Gestion des valeurs nulles dans les paramètres OracleCommand

cmd.CommandText = "INSERT INTO tcustomer(cust_id, salutation_id) VALUES(ORADBA.SEQCUST.NEXTVAL, :salid) RETURNING cust_id INTO :newcid" ; 

if (sal_id==0) { 
    cmd.Parameters.Add("salid", Null) ; 
} else { 
    cmd.Parameters.Add("salid", sal_id) ; 
} 

cmd.Parameters.Add("newcid", OracleDbType.Int32).Direction = ParameterDirection.ReturnValue ; 

cmd.ExecuteNonQuery() ; 

String newcidval = cmd.Parameters["newcid"].Value.ToString() ; 
cmd.Dispose() ; 

Répondre

17

Essayez System.DBNull INSEAD null.

La classe DBNull représente une valeur inexistante . Dans une base de données, pour l'exemple , une colonne dans une rangée d'une table peut ne pas contenir de données quelconques. Autrement dit, la colonne est considérée comme n'existe pas du tout au lieu de simplement ne pas ayant une valeur. Un objet DBNull représente la colonne inexistante

+5

... Merci eu à travailler avec System.DBNull.Value fait. –

+1

La réponse d'Andrew Hare est faux comme Dan U. posté. C'est System.DBNull.Value –

0

Pour moi DBNull.Value n'a pas fonctionné, alors je l'ai fait comme ceci:

cmd.Parameters.Add("salid", "Null") ; 

et il a très bien fonctionné.

5

DBNull ne peut pas être affecté à un autre type de données, vous devez donc le convertir implicitement en objet.

cmd.Parameters.Add(new OracleParameter(":number_column", OracleType.Number)).Value = (s.Class.HasValue) ? s.Class.Value : (object)DBNull.Value; 

où s.Class est int? et la valeur du paramètre est défini comme (object)DBNull.Value dans le cas où elle est nulle

0

Vous pouvez ajouter un paramètre vide (il sera nul pour commencer), et seulement définir la valeur si sal_id != 0:

var p = cmd.Parameters.Add("salid", OracleDbType.Int32); 
if (sal_id != 0) { 
    p.Value = sal_id; 
} 
1

DBNull.Value fonctionne pour certains mais j'avais besoin de le convertir en un Oracle Type implémenté INullable. Je recommande cette approche si vous utilisez un type de données Nullable:

(Oracle.ManagedDataAccess.Types.OracleDecimal)command.Parameters["pKey"].Value)).IsNull 
0

vous pouvez vérifier l'état de votre objet OracleParameter - si elle est égale à OracleParameterStatus.NullFetched, rien a été tiré par les cheveux, sinon utiliser l'attribut de valeur de param.

Exemple:

var _myParam = new OracleParameter("p_param", OracleDbType.Object, ParameterDirection.Output) { UdtTypeName = "my_schema.MY_TYPE" }; 

... (add command parameter) 
... (execute command) 

var _myResponse = _myParam.Status == OracleParameterStatus.NullFetched ? null : MapMyTypeFromOracleType((MyType)_myParam.Value); 
Questions connexes