.Net вставка значений NULL в базу данных SQL Server из значений переменных - PullRequest
6 голосов
/ 06 марта 2009

Были похожие вопросы, но ответы были не те, что я искал. Я хочу вставить значение NULL в базу данных SQL Server, если ссылка имеет значение NULL или значение еще не было назначено. На данный момент я тестирую на ноль, и это выглядит как

String testString = null;

if (testString == null)
{
    command.Parameters.AddParameter(new SqlParameter("@column", DBNull.Value);
}
else
{
    command.Parameters.AddParameter(new SqlParameter("@column", testString);
}

Это выглядит и кажется мне невероятно неуклюжим. У меня есть довольно много значений, которые я вставляю в базу данных, и проверить их все, как указано выше, очень многословно. Разве .Net не справляется с этим каким-либо образом. Я подумал, может быть, если бы я использовал строку в отличие от String, но это также не работает. Оглядываясь вокруг, я нашел статьи, в которых говорится об использовании типов Nullable.

System.Nullable<T> variable

Это похоже на примитивы, int ?, char? удваивать? и бул? Так что это может работать для тех, но как насчет строк? Я что-то здесь упускаю? Какие типы я должен использовать для примитивных значений и строковых значений, чтобы мне не приходилось повторно проверять значения перед их вставкой.

EDIT: Прежде чем я получу слишком много ответов о троичных операторах. Мне они нравятся, но не в этом контексте. Мне не имеет смысла проверять это значение и иметь всю эту дополнительную логику, когда такого рода вещи могли бы быть реализованы ниже в платформе .Net, и если бы я знал, какие типы давать, он бы получил это бесплатно.

Edit: Хорошо, ребята, помогите мне сформулировать мой план атаки. Я буду использовать Nullable для моих примитивов (int ?, double? И т.д.), а для моих строк я буду использовать String, но ?? тестовое задание. Это делает вещи менее многословными. Есть ли что-то, чего мне здесь не хватает, например, может быть, я теряю некоторую семантику?

Ответы [ 7 ]

11 голосов
/ 06 марта 2009

Даже лучше, чем троичный, оператор двойного знака вопроса (??). Принимает первое ненулевое значение. Итак:

string x = null;
command.Parameters.AddParameter(
     new SqlParameter("@column", (object)x ?? DBNull.Value);

даст вам значение со значением DBNull.Value, но

string x = "A String";
command.Parameters.AddParameter(
     new SqlParameter("@column", (object)x ?? DBNull.Value);

Даст вам парм со значением "A String".

3 голосов
/ 06 марта 2009

Nullable отлично работает для примитивов. Я собираюсь проверить поведение строки, но один из способов хотя бы очистить ваш код - определить метод расширения строки.

Вы можете использовать ?? оператор для строк:

command.Parameters.AddParameter (новый SqlParameter ("@ column", myNull ?? (объект) DBNull.Value);

?? возвращает первый элемент, если он не нулевой, в противном случае он возвращает второй элемент.

Редактировать

Исправлен код, приведенный выше, поэтому он будет компилироваться, вам нужно привести DBNull.Value к объекту.

0 голосов
/ 04 марта 2013

Пример:

if (txtDisplayName.Text != "")
{
    insert into table (id,display_name) values ('" + txtID.Text + "','" + txtDisplayName.Text + "');
}
else
{
    insert into table (id) values ('" + txtID.Text + "');
}

Это вставит null.

0 голосов
/ 06 марта 2009

Nullable<T> нельзя применить к String, поскольку это ссылочный тип, а не тип значения.

0 голосов
/ 06 марта 2009

Я согласен, что неуклюже и немного прискорбно, что SqlParameter.Value должен быть установлен в DbNull.Value. Но нет никакого способа обойти это, так что вы должны жить с тестированием на ноль.

0 голосов
/ 06 марта 2009

То, что я иногда делаю, это:

command.Parameters.Add ("@column", SqlDbType.VarChar).Value = DBNull.Value;

if( String.IsNullOrEmpty (theString) == false )
{
    command.Parameters["@column"].Value = theString;
}
0 голосов
/ 06 марта 2009

Может быть, троичный оператор - это то, что вам нужно.

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