Frage

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;
}

Ich versuche, DBNULL in der 1. Schleife zu handhaben, aber in der zweiten habe ich dann alle Zeilen von Newrow () vom DBNULL -Typ erstellt.

zB RowType ~ dbnull

Warum ist das passiert?

War es hilfreich?

Lösung

Sie können dies verwenden, um herauszufinden, ob der Wert, den Sie betrachten, dbnull ist:

reader.IsDBNull(i)

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

Um den Typ der Spalte zu finden, in dem Sie sich befinden, versuchen Sie Folgendes:

reader.GetFieldType(i)

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

Ich denke auch, dass es nicht nötig ist new DataRow() In der ersten Zeile, wenn Sie diese Referenz aufgeben, indem Sie dies tun row = tbl.NewRow() Nach der ersten Schleife.

Andere Tipps

Verwenden Convert.IsDBNull(reader[i]).

Das Vergleich von Gettype () -Ergebnis mit String ist schrecklich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top