更新保持 Null 状态的数据库

本文关键字:数据库 状态 Null 更新 | 更新日期: 2023-09-27 17:47:21

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

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

更新保持 Null 状态的数据库

Nullable Type也是为了同样的目的。它们表示值类型,其中可能没有数据。可以使用这些类型的 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
    }
} 

如果可为空的类型具有值,则空合并运算符将设置该值,否则它将设置您指定的其他值(在本例中为 DBNull.Value)。

您可以将参数定义为可为空的小数。可为空值类型的 C# 语法,如下所示:

decimal? rebateAmountOrWhatever;

然后,您可以在变量中存储空值,并将变量与空值进行比较。

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

使用 ?? 运算符也很有趣,如下所示:

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

声明变量的等效方法是使用 Nullable<> 泛型类型,如下所示:

Nullable<decimal> currentIraBalance = null;

可以使用 DBNull 类来表示 Web 服务代码上的空值。

虽然您仍然必须使用代理项值(例如,0 或 -1),然后仅评估该值以将其转换为 DBNull 对象。