Просто добавьте свойство в свой пользовательский класс UITableViewCell (в зависимости от реализации), которое содержит int, NSNumber или NSIndexPath, указывающее, какое оно есть. Если вместо этого вы используете структуру данных, то поместите ее в свой элемент в этой структуре данных. Затем вы просто устанавливаете свойство при создании структуры данных, что-то вроде elt.id = i, и затем вы получаете к нему доступ в cellForRowAtIndexPath, что-то вроде if (elt.id == 0 || elt.id == n-1 ) где n - количество строк в вашем разделе.
Возможно, я полностью пропустил ваш вопрос, но если бы я это сделал, просто прокомментируйте, и я опубликую еще раз.
Не так, нет. Типы должны совпадать. То же верно и для троичного.
Под словом «совпадение» я не имею в виду, что они должны быть одинаковыми. Но они должны быть совместимы по назначению. В основном: в том же дереве наследования.
Один из способов обойти это - преобразовать вашу строку в объект:
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;
}
Также обратите внимание, что я явно объявил тип параметра.
new SqlParameter("@theParam", (object)theParam ?? DBNull.Value)
Оператор 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))
В вашей хранимой процедуре, когда вы объявляете входящую переменную, установите переменную, равную нулю, а затем не передавайте ее из вашего кода csharp, тогда она возьмет значение по умолчанию из sql
@theParam as varchar(50) = null
, а затем в вашем csharp
if (theParam != null)
cmd.Parameters.Add(new SqlParameter("@theParam", theParam));
Вот как я обычно передаю параметры и / или значения по умолчанию в свои сохраненные процессы
Причина, по которой вы не можете использовать нулевой оператор объединения, заключается в том, что он должен возвращать один тип, а вы предоставляете более одного типа. 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)
);
?? Оператор возвращает левый операнд, если он не равен нулю, или же возвращает правый операнд. Но в вашем случае они разных типов, так что это не работает.
Я почти уверен, что простая передача нуля конструктору SqlParameter приведет к его отправке как DBNull.Value ... Я могу ошибаться, поскольку я использую EnterpriseLibraries для доступа к БД , но я совершенно уверен, что здесь можно отправить нулевое значение.
Не знаю точного ответа на ваш вопрос, но как насчет этого?
string.IsNullOrEmpty(theParam) ? DBNull.Value : theParam
или если пусто
(theParam == null) ? DBNull.Value : theParam
Используйте этот синтаксис:
( theParam как объект) ?? (DBNull.Value как объект)
В этом случае обе части оператора ?? однотипны.
cmd.Parameters.Add (new SqlParameter ("@ theParam", (theParam == null)? DBNull.Value: theParam));