2008-10-08 52 views
0

我有一个asp.net文本形式,其中包含许多可选的小数字段。我想有选择地更新数据库,但不为没有数据的字段(保持空状态)插入“0”。数据库空

通常,我会创建多个函数,每个函数都有不同的签名来处理这个问题。但是,我通过web服务插入数据,该服务不允许具有相同名称的函数具有多个签名。我可以想到一些方法来解决这个问题,但没有“实用”。

谢谢!

回答

2

Nullable Types意思是相同的目的。它们代表价值类型,可能没有数据。值的存在可以使用这些类型的HasValue属性进行检查。

伪代码读取领域:

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

当你说多种方法 - 我认为这些都是重载方法可以添加可选字段(因此n可选字段意味着N多方法)

您可以通过编写单一方法避免编写这些方法。假设你有一个必填字段和一个可选字段:

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

然后定义使用它的Web服务方法:

[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 
    } 

} 

如果可空类型有一个值,Null Coalescing Operator将设置的值,否则它会设置你指定的另一个值(在我们的例子中是DBNull.Value)。

1

您可以使用DBNull class在您的Web服务代码上表示空值。

虽然您仍然必须使用替代值(例如0或-1),然后只需评估该值即可将其转换为DBNull对象。

2

您可以将您的参数定义为可为空的小数。可空值类型这样的C#语法:

decimal? rebateAmountOrWhatever; 

然后,您可以存储在空变量和比较变量设置为null。

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

还有很大的乐趣可以使用?操作员这样的:

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

声明变量的等效方法是使用可空<>通用类型是这样的:

Nullable<decimal> currentIraBalance = null;