C # проверяет, что значение вставки пусто или равно нулю из-за перезаписи с пустой строкой - PullRequest
1 голос
/ 14 марта 2012

У меня есть класс с разными атрибутами, допустим.

Object.attributeA
Object.attributeB
Object.attributeC
Object.attributeD

Однако они не всегда заполнены. Например:

Object.attributeA = "string";
Object.attributeB = "string";
Object.attributeC =  null;
Object.attributeD = "string";

Моя инструкция вставки выглядит следующим образом:

string sql = @"INSERT INTO TABLE
        (
attributeA,
attributeB,
attributeC,
attributeAD
)
values
(
@attributeA,
@attributeB,
@attributeC,
@attributeAD
);";
SqlParameter[] parameters = 
{
new SqlParameter("@attributeA", SqlDbType.NVarChar)   {Value = attributeA},
new SqlParameter("@attributeB", SqlDbType.NVarChar)   {Value = attributeB},
new SqlParameter("@attributeC", SqlDbType.NVarChar)   {Value = attributeC},
new SqlParameter("@attributeD", SqlDbType.NVarChar)   {Value = attributeD}
};
ExecuteNoNQuery(sql, parameters);

Как мне вставить ноль?

(Для подтверждения: когда я обновляю строку, я хочу сохранить старое значение, если новое значение равно нулю, с помощью "" я просто перезаписал старое значение, верно?)

Старый ряд "abc" "abc" "abc" "abc"

Обновить строку: "string" "string" "abc" "string"

И НЕ: "строка" "строка" "" "строка"

EDIT: У меня есть две таблицы. Я использую вставку для первой таблицы, добавляю атрибуты (что-то вроде временного сохранения) И ТОГДА я беру эту строку таблицы для обновления строки «реальной» таблицы. Атрибуты в таблице 1 всегда больше реальной таблицы. Вот почему после вставки "" я просто перезаписываю атрибут в реальной таблице.

Моя функция обновления выглядит примерно так:

public void UpdateBatchToRealTable(Class, int id)
    {
        // Current Batch
        DataTable dt = DAL.Batch(id);

        // table 1 (temp table) -> table 2 (real table) 
        DataRow row = dt.Rows[0];

        Object.attributeA   = row["attributeA"].ToString();
        Object.attributeB   = row["attributeB"].ToString();
        Object.attributeC   = row["attributeC"].ToString();
        Object.attributeD   = row["attributeD"].ToString();
    }

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Если я понял ваш вопрос (кажется, вы спрашиваете об ОБНОВЛЕНИИ, но ваш образец - ВСТАВКА), вы можете сделать что-то вроде:

UPDATE Table
SET AttributeA = ISNULL(@AttributeA, AttributeA)
...

, который оставит AttributeA без изменений, если параметр @AttributeA равен NULL (DBNull.Value).

Или, если вы хотите игнорировать пустые строки:

UPDATE Table
SET AttributeA = CASE WHEN LEN(@AttributeA) = 0 THEN AttributeA ELSE @AttributeA END
...

Или, если вы хотите игнорировать как NULL, так и пустые строки:

UPDATE Table
SET AttributeA = CASE WHEN LEN(ISNULL(@AttributeA,'')) = 0 THEN AttributeA ELSE @AttributeA END
...
0 голосов
/ 14 марта 2012

Вы можете использовать оператор двойного знака вопроса.

Value = attributeA ?? DBNull.Value

Это назначит значение справа от '??' значение левой стороны (в этом примере attributeA) равно нулю.

Вы можете использовать это во всех видах мест, когда хотите назначить другое значение по умолчанию, когда объекты могут быть нулевыми.

0 голосов
/ 14 марта 2012

Использовать DBNull.Value Значение в тех параметрах, где вы хотите передать значение NULL ........

...