Question

Dans ADO.NET, j'utilise GetSchemaTable pour renvoyer la table de schéma d'un ensemble de résultats.

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

Malheureusement, la valeur "ProviderType" s'affiche sous la forme d'un entier, et non de la valeur d'énumération OleDbType :

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

Tous ces entiers sont les valeurs d'énumération pour Énumération OleDbType:

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

Je souhaite afficher le type de données sous une forme lisible par l'homme plutôt que sous la forme d'un entier.

J'ai essayé de parcourir le schéma DataTable et de modifier les valeurs à l'intérieur du DataTable:

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();

Mais cela lève une exception:

Column 'ProviderType' is read only.

J'ai même consulté le RowDataBound , pensant pouvoir modifier la valeur au fur et à mesure de son rendu:

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

Mais il ne semble pas que vous puissiez jouer avec les valeurs affichées.

Quelqu'un peut-il suggérer un bon moyen de tirer le meilleur parti de la valeur de la colonne ProviderType afin qu'il soit lisible par l'homme lorsque je l'affiche à l'homme?

Mettre à jour

La solution que j'utilise actuellement consiste à ajouter une colonne supplémentaire à la fin:

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();
Était-ce utile?

La solution

Je suis peut-être complètement déconnecté, mais vous ne pouvez pas simplement définir la propriété ReadOnly de la colonne sur false? J'aime:

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

Ensuite, vous pourriez rencontrer un problème de type de colonne lorsque vous essayez de placer une valeur de chaîne dans une colonne d’entier. Mais cela devrait vous amener dans la bonne direction.

modifier:

Résolution du problème de type de colonne:

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

Autres conseils

Vous pouvez également créer un objet avec tous les champs du datatable, transférer toutes les données dans votre objet et le modifier ou créer un champ en lecture seule qui renvoie la chaîne correspondant à l'entier donné.

GridView et d’autres acceptent également les tableaux d’objets en tant que sources de données, de sorte qu’ils sont automatiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top