Действительно ли возможно объединить строку и DBNull в C#?

Просто добавьте свойство в свой пользовательский класс UITableViewCell (в зависимости от реализации), которое содержит int, NSNumber или NSIndexPath, указывающее, какое оно есть. Если вместо этого вы используете структуру данных, то поместите ее в свой элемент в этой структуре данных. Затем вы просто устанавливаете свойство при создании структуры данных, что-то вроде elt.id = i, и затем вы получаете к нему доступ в cellForRowAtIndexPath, что-то вроде if (elt.id == 0 || elt.id == n-1 ) где n - количество строк в вашем разделе.

Возможно, я полностью пропустил ваш вопрос, но если бы я это сделал, просто прокомментируйте, и я опубликую еще раз.

10
задан Beska 9 October 2009 в 19:55
поделиться

10 ответов

Не так, нет. Типы должны совпадать. То же верно и для троичного.

Под словом «совпадение» я не имею в виду, что они должны быть одинаковыми. Но они должны быть совместимы по назначению. В основном: в том же дереве наследования.

Один из способов обойти это - преобразовать вашу строку в объект:

var result = (object)stringVar ?? DBNull.Value;

Но мне это не нравится, потому что это означает, что вы больше полагаетесь на конструктор SqlParameter, чтобы получить ваши типы правы. Вместо этого мне нравится делать это так:

cmd.Parameters.Add("@theParam", SqlDbTypes.VarChar, 50).Value = theParam;
// ... assign other parameters as well, don't worry about nulls yet

// all parameters assigned: check for any nulls
foreach (var p in cmd.Parameters) 
{ 
    if (p.Value == null) p.Value = DBNull.Value; 
}

Также обратите внимание, что я явно объявил тип параметра.

16
ответ дан 3 December 2019 в 15:36
поделиться
new SqlParameter("@theParam", (object)theParam ?? DBNull.Value)
5
ответ дан 3 December 2019 в 15:36
поделиться

Оператор Null Coalesce только с данными того же типа. Вы не можете отправить NULL в SqlParamater, так как это заставит Sql Server сказать, что вы не указали параметр.

Вы можете использовать

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

Или вы можете создать функцию, которая возвращает DBNull, когда обнаруживается null, например

public static object GetDataValue(object o)
{
    if (o == null || String.Empty.Equals(o))
        return DBNull.Value;
    else
        return o;
}

А затем позвоните по номеру

new SqlParameter("@theParam", GetDataValue(theParam))
2
ответ дан 3 December 2019 в 15:36
поделиться

В вашей хранимой процедуре, когда вы объявляете входящую переменную, установите переменную, равную нулю, а затем не передавайте ее из вашего кода csharp, тогда она возьмет значение по умолчанию из sql

@theParam as varchar(50) = null

, а затем в вашем csharp

if (theParam != null)
    cmd.Parameters.Add(new SqlParameter("@theParam", theParam));

Вот как я обычно передаю параметры и / или значения по умолчанию в свои сохраненные процессы

1
ответ дан 3 December 2019 в 15:36
поделиться

Причина, по которой вы не можете использовать нулевой оператор объединения, заключается в том, что он должен возвращать один тип, а вы предоставляете более одного типа. theParam - строка. DbNull.Value - это ссылка на статический экземпляр типа System.DbNull . Вот как выглядит его реализация:

public static readonly DBNull Value = new DBNull(); 
//the instantiation is actually in the 
//static constructor but that isn't important for this example

Итак, если бы у вас был метод NullCoalesce, каков был бы его тип возврата? Это не может быть одновременно System.String и System.DbNull, он должен быть одним или другим или общим родительским типом.

Итак, это приводит к этому типу кода;

cmd.Parameters.Add(
    new SqlParameter("@theParam", (object)theParam ?? (object)DBNull.Value)
);
2
ответ дан 3 December 2019 в 15:36
поделиться

?? Оператор возвращает левый операнд, если он не равен нулю, или же возвращает правый операнд. Но в вашем случае они разных типов, так что это не работает.

3
ответ дан 3 December 2019 в 15:36
поделиться

Я почти уверен, что простая передача нуля конструктору SqlParameter приведет к его отправке как DBNull.Value ... Я могу ошибаться, поскольку я использую EnterpriseLibraries для доступа к БД , но я совершенно уверен, что здесь можно отправить нулевое значение.

0
ответ дан 3 December 2019 в 15:36
поделиться

Не знаю точного ответа на ваш вопрос, но как насчет этого?

string.IsNullOrEmpty(theParam) ? DBNull.Value : theParam

или если пусто

(theParam == null) ? DBNull.Value : theParam
-1
ответ дан 3 December 2019 в 15:36
поделиться

Используйте этот синтаксис:

( theParam как объект) ?? (DBNull.Value как объект)

В этом случае обе части оператора ?? однотипны.

0
ответ дан 3 December 2019 в 15:36
поделиться

cmd.Parameters.Add (new SqlParameter ("@ theParam", (theParam == null)? DBNull.Value: theParam));

0
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: