Gestion des valeurs nulles dans les paramètres OracleCommand
Question
Je suis en train de déterminer comment spécifier null comme une valeur de paramètre dans un OracleCommand utilisant le code C # suivant. J'ai extrait les bits pertinents, mais essentiellement le point est si sal_id vient avec la valeur 0, il doit être stocké comme nul. J'ai essayé Null, « nul », et un couple d'autres choses, mais jusqu'à présent pas de chance.
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() ;
La solution
System.DBNull
INSEAD de null
.
La classe DBNull représente un valeur inexistante. Dans une base de données, pour par exemple, une colonne d'une ligne d'une table pourrait ne pas contenir de données que ce soit. Autrement dit, la colonne est considéré comme ne pas exister du tout au lieu de simplement pas ayant une valeur. Un objet DBNull représente la colonne inexistante
Autres conseils
DBNull ne peut être attribué à tout autre type de données doivent donc convertir implicitement à l'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éfinie comme (object)DBNull.Value
dans le cas où il est nul
DBNull.Value
fonctionne pour certains, mais je devais le jeter à un type Oracle mis en œuvre INullable
. Je recommande cette approche si vous utilisez un type de données Nullable:
(Oracle.ManagedDataAccess.Types.OracleDecimal)command.Parameters["pKey"].Value)).IsNull
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 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 );
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;
}
Pour moi DBNull.Value
n'a pas fonctionné, alors je l'ai fait comme ceci:
cmd.Parameters.Add("salid", "Null") ;
et il fonctionnait très bien.