2008-10-08 9 views
0

J'ai un formulaire texte asp.net qui contient de nombreux champs décimaux facultatifs. Je souhaite mettre à jour la base de données de manière sélective, mais n'insère pas de "0" pour les champs qui n'ont pas de données (maintien de l'état nul).Base de données Null

En règle générale, je créer plusieurs fonctions, chacune avec une signature différente pour gérer cela. Toutefois, j'insère les données via un service Web qui ne permet pas à une fonction portant le même nom d'avoir plusieurs signatures. Je peux penser à quelques façons de contourner cela, mais aucune "de façon pragmatique".

Merci!

Répondre

2

Nullable Types sont destinés au même but. Ils représentent des types de valeur avec la possibilité de ne pas avoir de données dans ceux-ci. La présence de la valeur peut être vérifiée en utilisant la propriété HasValue de ces types.

Pseudo code pour lire les champs:

decimal? dValue; // default value is null 
if(decimalValueExists) 
{ 
    dValue = <value read from text file> 
} 

Quand vous dites plusieurs méthodes - Je suppose que ceux-ci sont surchargées méthodes pour pouvoir ajouter des champs optionnels (donc n champs facultatifs, des méthodes de n plus)

Vous pouvez éviter d'écrire ces méthodes en écrivant une seule méthode. Supposons que vous ayez un champ obligatoire et un champ facultatif:

public class MyFields 
{ 
    decimal req1; 
    decimal? opt1; // optional field 1 
} 

Ensuite, définir la méthode de service Web pour l'utiliser:

[WebMethod] 
void MyWSMethod(MyFields myFields) 
{/* code here will ultimately call InsertMyFields */} 

void InsertMyFields(MyFields myFields) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     // Create the command and set its properties. 
     SqlCommand command = new SqlCommand(); 
     command.Connection = connection; 
     command.CommandText = "AddMyFields"; 
     command.CommandType = CommandType.StoredProcedure; 

     // Add the required input parameter 
     SqlParameter parameter1 = new SqlParameter(); 
     parameter1.ParameterName = "@ReqField1"; 
     parameter1.SqlDbType = SqlDbType.NVarChar; 
     parameter1.Direction = ParameterDirection.Input; 
     parameter1.Value = myFields.req1; 

     // Add the parameter to the Parameters collection. 
     command.Parameters.Add(parameter1); 

     // Add the optional parameter and set its properties. 
     SqlParameter parameter2 = new SqlParameter(); 
     parameter2.ParameterName = "@OptField1"; 
     parameter2.SqlDbType = SqlDbType.NVarChar; 
     parameter2.Direction = ParameterDirection.Input; 
     parameter2.Value = myFields.opt1 ?? DBNull.Value; //null coalescing operator 

     // Add the parameter to the Parameters collection. 
     command.Parameters.Add(parameter2); 

     //.. rest of the code 
    } 

} 

Si le type Nullable a une valeur, Null Coalescing Operator règlera la valeur ou bien il va définir l'autre valeur que vous spécifiez (DBNull.Value dans notre cas).

1

Vous pouvez utiliser DBNull class pour représenter une valeur nulle sur votre code de service Web.

Bien que vous deviez toujours utiliser une valeur de substitution (par exemple, 0 ou -1), puis évaluez simplement cette valeur pour la convertir en l'objet DBNull.

2

Vous pouvez définir vos paramètres en tant que décimales NULL. La syntaxe C# pour un type de valeur nullable comme ceci:

decimal? rebateAmountOrWhatever; 

Vous pouvez ensuite stocker dans la variable nulls et comparer la variable à null.

new SqlParameter("@RebateAmount", 
    rebateAmountOrWhatever == null ? (object)DBNull.Value : (object)rebateAmountOrWhatever) 

Il y a aussi beaucoup de plaisir à HAD avec le ?? opérateur comme ceci:

new SqlParameter("@RebateAmount", 
(object)rebateAmountOrWhatever ?? (object)DBNull.Value) 

manière équivalente à déclarer la variable est le Nullable <> type générique comme ceci:

Nullable<decimal> currentIraBalance = null; 
Questions connexes