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





Вы можете использовать DBNull класс для представления нулевого значения в коде вашего веб-сервиса.
Хотя вам все равно придется использовать суррогатное значение (например, 0 или -1), а затем просто оценить это значение, чтобы преобразовать его в объект DBNull.
Обнуляемые типы предназначены для той же цели. Они представляют типы значений с возможностью отсутствия в них данных. Наличие значения можно проверить с помощью свойства 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
}
}
Если тип, допускающий значение NULL, имеет значение, Оператор Null Coalescing установит значение, иначе он установит другое указанное вами значение (DBNull.Value в нашем случае).
Вы можете определить свои параметры как десятичные дроби, допускающие значение NULL. Синтаксис C# для типа значения, допускающего значение NULL, например:
decimal? rebateAmountOrWhatever;
Затем вы можете сохранить значения NULL в переменной и сравнить переменную с NULL.
new SqlParameter("@RebateAmount",
rebateAmountOrWhatever == null ? (object)DBNull.Value : (object)rebateAmountOrWhatever)
Есть также большое удовольствие, которое можно получить, используя ?? оператор вроде этого:
new SqlParameter("@RebateAmount",
(object)rebateAmountOrWhatever ?? (object)DBNull.Value)
Эквивалентный способ объявления переменной - универсальный тип Nullable <>, например:
Nullable<decimal> currentIraBalance = null;