Тип DataRow - DBNull - PullRequest
       26

Тип DataRow - DBNull

0 голосов
/ 29 ноября 2011
private DataRow getDataRowFromReader(IDataReader reader)
{
    DataRow row = new DataRow();
    DataTable tbl = new DataTable();
    for (int i = 0; i < reader.FieldCount; i++)
    {
        Type type = reader[i].GetType();
        if(type.Equals(Type.GetType("DBNull")) || type.Equals(Type.GetType("System.DBNull")))
            type = typeof(string);
        DataColumn col = new DataColumn(reader.GetName(i), type);
        tbl.Columns.Add(col);
    }
    row = tbl.NewRow();
    for (int i = 0; i < reader.FieldCount; i++)
    {
        Type readerType = reader[i].GetType();
        Type rowType = row[i].GetType();
        if (readerType.Equals(rowType))
            row[i] = reader.GetValue(i);
        else
            row[i] = reader.GetString(i);
    }
    return row;
}

Я пытаюсь обработать DBNull в 1-м цикле, но во втором у меня есть все строки, созданные NewRow () типа DBNull.

например, rowType ~ DBNull

Почему это происходит?

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Использовать Convert.IsDBNull(reader[i]).

Сравнение результата GetType () со строкой ужасно.

1 голос
/ 29 ноября 2011

Вы можете использовать это, чтобы узнать, является ли значение, которое вы просматриваете, DBNull:

reader.IsDBNull(i)

см. http://msdn.microsoft.com/en-us/library/system.data.idatarecord.isdbnull.aspx

Чтобы найти тип столбца, который вы ищетепопробуйте следующее:

reader.GetFieldType(i)

см. http://msdn.microsoft.com/en-us/library/system.data.idatarecord.getfieldtype.aspx

Кроме того, я думаю, что нет необходимости в new DataRow() в первой строке, если вы отказываетесь от этой ссылки, выполняя row = tbl.NewRow() после первого цикла.

...