C # DBNull и nullable Types - чистейшая форма конвертации

Если вы знаете, что элементы всегда хешируются, вы можете использовать Counter(), который является O (n). Если вы знаете, что элементы всегда сортируемы, вы можете использовать sorted(), который является O (n log n)

В общем случае вы не можете полагаться на возможность сортировки или наличия элементов, поэтому вам нужен такой резерв, который, к сожалению, O (n ^ 2)

len(a)==len(b) and all(a.count(i)==b.count(i) for i in a)
37
задан Ruben Bartelink 24 April 2017 в 20:21
поделиться

6 ответов

Глава LINQ to DataSets в LINQ in Action - это хорошее прочтение.

Одна вещь, которую вы увидите, это метод расширения Поле , который используется следующим образом: -

int? x = dr.Field<int?>( "Field" );

Или

int y = dr.Field<int?>( "Field" ) ?? 0;

Или

var z = dr.Field<int?>( "Field" );
55
ответ дан 27 November 2019 в 04:40
поделиться
int? a = (int?)dr["A"]
4
ответ дан 27 November 2019 в 04:40
поделиться

Это назначение класса DataRowExtensions в .NET 3.5, который предоставляет статическое поле и SetField методы для двустороннего переключения обнуляемых (и не обнуляемых) данных между типами DataRow и .NET.

int? fld = row.Field<int?>("ColumnA")

установит fld в null if row ["ColumnA"] содержит DBNull.Value , к его значению, если оно содержит целое число, и генерировать исключение, если оно содержит что-либо еще. На обратном пути

row.SetField("ColumnA", fld);

делает то же самое в обратном порядке: если fld содержит null , он устанавливает row ["ColumnA"] в ] DBNull.Value , а в противном случае устанавливает значение fld .

12
ответ дан 27 November 2019 в 04:40
поделиться

Почему бы не использовать LINQ? Он делает преобразование за вас.

1
ответ дан 27 November 2019 в 04:40
поделиться

Методы расширения!

Что-то вроде следующего:

public static class DataRowExtensions
{
    public static Nullable<T> GetNullableValue<T>(this DataRow row, string columnName)
        where T : struct
    {
        object value = row[columnName];
        if (Convert.IsDBNull(value))
            return null;

        return (Nullable<T>)value;
    }

    public static T GetValue<T>(this DataRow row, string columnName)
        where T : class
    {
        object value = row[columnName];
        if (Convert.IsDBNull(value))
            return null;

        return (T)value;
    }
}

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

int? a = dr.GetNullableValue<int>("A");

или

string b = dr.GetValue<string>("B");
0
ответ дан 27 November 2019 в 04:40
поделиться

Следующее будет работать, безопасно:

Snip:

public static class SqlDataReaderEx
{
    public static int TryParse(SqlDataReader drReader, string strColumn, int nDefault)
    {
        int nOrdinal = drReader.GetOrdinal(strColumn);
        if (!drReader.IsDbNull(nOrdinal))
            return drReader.GetInt32(nOrdinal);
        else
            return nDefault;
    }
}

Использование:

SqlDataReaderEx.TryParse(drReader, "MyColumnName", -1);
1
ответ дан 27 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

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