Pergunta

Em ADO.NET eu estou usando GetSchemaTable para retornar a tabela de esquema para um conjunto de resultados.

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

Infelizmente o "ProviderType" valor está exibindo como um inteiro, ao invés do OleDbType enumeração valor que é:

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

Todos estes números inteiros são os valores de enumeração para o OleDbType enumeração:

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

eu quero mostrar o tipo de dados tão legível algo humano, em vez de um inteiro.


Eu tentei looping através do esquema DataTable e modificar os valores dentro do 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();

Mas isso gera uma exceção:

Column 'ProviderType' is read only.

i sequer olhou para o GridView RowDataBound evento , pensando que eu poderia mudar o valor como ele é processado:

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

Mas não parece que você pode jogar com os valores prestados.

Alguém pode sugerir uma boa maneira de tanto com o valor da ProviderType coluna de modo que seja legível quando eu exibi-lo aos seres humanos?


Atualização

A solução que eu estou usando agora é tack uma coluna extra no final:

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();
Foi útil?

Solução

Eu poderia estar completamente fora aqui, mas você não pode simplesmente definir a propriedade ReadOnly da coluna para false? Como:

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

Depois que você pode obter um problema columntype como você está tentando colocar um valor string em uma coluna inteira. Mas isso deve levá-lo na direção certa.

Editar:

Resolver a questão columntype:

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

Outras dicas

Ou você poderia criar um objeto com todos os campos da tabela de dados, passar todos os dados em seu objeto e modificá-lo ou criar uma leitura único campo que retorna a seqüência de monitores segundo para o número inteiro dado.

GridView e outros também aceitam arranjos de objetos como fontes de dados por isso é automático.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top