Frage

In ADO.NET ich verwende GetSchemaTable setzen Sie die Schematabelle für ein Ergebnis zurückzukehren.

DataTable schema = rdr.GetSchemaTable();
gridSchema.DataSource = schema;
gridSchema.DataBind();

Unfortunatly der "Provider" Wert wird als ganze Zahl anzeigt, anstatt die OleDbType Enumerationswerts dass es ist:

ProviderType     Desired Display Value
============     =====================
129              Char
3                Integer
129              Char
129              Char
3                Integer
3                Integer
129              Char
135              DBTimeStamp
129              Char
129              Char
...

Alle diese ganzen Zahlen die die Aufzählungswerte für die OleDbType Aufzählung:

public enum OleDbType
{
    Empty = 0,
    SmallInt = 2,
    Integer = 3,
    Single = 4,
    Double = 5,
    Currency = 6,
    Date = 7,
    BSTR = 8,
    IDispatch = 9,
    Error = 10,
    Boolean = 11,
    Variant = 12,
    IUnknown = 13,
    Decimal = 14,
    TinyInt = 16,
    UnsignedTinyInt = 17,
    UnsignedSmallInt = 18,
    UnsignedInt = 19,
    BigInt = 20,
    UnsignedBigInt = 21,
    Filetime = 64,
    Guid = 72,
    Binary = 128,
    Char = 129,
    WChar = 130,
    Numeric = 131,
    DBDate = 133,
    DBTime = 134,
    DBTimeStamp = 135,
    PropVariant = 138,
    VarNumeric = 139,
    VarChar = 200,
    LongVarChar = 201,
    VarWChar = 202,
    LongVarWChar = 203,
    VarBinary = 204,
    LongVarBinary = 205,
}

Ich möchte den Datentyp als etwas vom Menschen lesbaren und nicht angezeigt werden als eine ganze Zahl ist.


Ich habe durch das Schema Datatable versucht, Looping und die Werte innerhalb des Datatable ändern:

DataTable schema = rdr.GetSchemaTable();

//Change providerType column to be readable
foreach (DataRow row in schema.Rows)
{
   OleDbType t = (OleDbType)row["ProviderType"];
   row["ProviderType"] = t.ToString();
}

gridSchema.DataSource = schema;
gridSchema.DataBind();

Aber das löst eine Ausnahme:

Column 'ProviderType' is read only.

i auch bei der Gridview der RowDataBound Ereignis, dachte ich den Wert ändern könnte, wie es gemacht wird:

protected void gridSchema_RowDataBound(object sender, GridViewRowEventArgs e)
{
   //todo: magic
   //e.Row["ProviderType"]
}

Aber es sieht nicht wie Sie mit gerenderten Werte spielen können.

Kann ich jemand eine nette Art und Weise zu viel vorschlägt mit dem Wert der Provider Spalte, so dass es menschlich lesbar ist, wenn ich es für die Menschen darstellen?


Update

Die Abhilfe i gerade jetzt habe, ist eine zusätzliche Spalte am Ende heften:

DataTable schema = rdr.GetSchemaTable();

schema.Columns.Add("OleDbDataType", typeof(String));
schema.Columns.Add("CLRDataType", typeof(String));
foreach (DataRow row in schema.Rows)
{
   //Show the actual provider type
   OleDbType t = (OleDbType)row["ProviderType"];
   row["OleDbDataType"] = t.ToString();

   //Show the corresponding CLR type while we're doing a hack
   row["CLRDataType"] = row["DataType"].ToString();
}

gridSchema.DataSource = schema;
gridSchema.DataBind();
War es hilfreich?

Lösung

Ich könnte ganz aus seiner hier, aber können Sie nicht nur die Readonly-Eigenschaft der Spalte auf false gesetzt? Wie:

schema.Columns["ProviderType"].ReadOnly = false;

Danach können Sie ein Column Problem zu bekommen, wie Sie einen String-Wert in eine Integer-Spalte zu setzen versuchen. Aber das sollten Sie in die richtige Richtung.

Bearbeiten

Die Lösung der Column Ausgabe:

DataTable newTable = schema.Clone();
newTable.Columns["ProviderType"].DataType = typeof(string);

foreach (DataRow dr in schema.Rows)
{
    DataRow newRow = newTable.NewRow();
    // fill newRow with correct data and newly formatted providertype

    newTable.Rows.Add(newRow);
}

Andere Tipps

Oder Sie könnten ein Objekt mit allen Feldern aus der Datentabelle, übergeben Sie all Daten in Ihr Objekt erstellen und ändern oder ein Nur-Lese-Feld erstellen, die die Zeichenfolge Acording gegeben auf die ganze Zahl zurückzugibt.

Gridview und andere auch Objekt-Arrays als Datenquellen akzeptieren, so dass es automatisch.

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