База данных Null - PullRequest
       8

База данных Null

0 голосов
/ 08 октября 2008

У меня есть текстовая форма asp.net, которая содержит множество десятичных полей, которые являются необязательными. Я хочу выборочно обновлять базу данных, но не вставляя «0» для полей, которые не имеют данных (поддерживая нулевой статус).

Как правило, я бы создал несколько функций, каждая с разной подписью, чтобы справиться с этим. Однако я вставляю данные через веб-сервис, который не позволяет функции с одинаковым именем иметь несколько подписей. Я могу придумать пару способов обойти это, но ни один "прагматично".

Спасибо!

Ответы [ 3 ]

2 голосов
/ 08 октября 2008

Обнуляемые типы предназначены для той же цели. Они представляют типы значений с возможностью отсутствия данных в них. Наличие значения можно проверить с помощью свойства 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  
}

Затем определите метод веб-службы для его использования:

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

} 

Если у типа nullable есть значение, Оператор слияния Null установит значение, иначе он установит другое указанное вами значение (DBNull.Value в нашем случае).

2 голосов
/ 08 октября 2008

Вы можете определить свои параметры как обнуляемые десятичные дроби. Синтаксис C # для типа значения Nullable, например:

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;
1 голос
/ 08 октября 2008

Вы можете использовать класс DBNull для представления нулевого значения в коде вашего веб-сервиса.

Хотя вам все равно придется использовать суррогатное значение (например, 0 или -1), а затем просто оценить это значение, чтобы преобразовать его в DBNull объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...