Вопрос

В ADO.NET я использую Становится доступным чтобы вернуть таблицу схемы для набора результатов.

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

К сожалению , "ProviderType" (Тип поставщика) значение отображается в виде целого числа, а не OleDbType ( 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
...

Все эти целые числа являются значениями перечисления для OleDbType ( 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,
}

я хочу отображать тип данных как нечто удобочитаемое человеком, а не как целое число.


я попытался прокрутить схему DataTable и изменить значения внутри 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();

Но это приводит к возникновению исключения:

Column 'ProviderType' is read only.

я даже посмотрел на экран GridView RowDataBound - строка данных событие, думая, что я мог бы изменить значение по мере его отображения:

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

Но не похоже, что вы можете играть с отображаемыми значениями.

Кто-нибудь может предложить хороший способ сделать многое со значением ProviderType ( Тип поставщика) столбец, чтобы он был удобочитаем для человека, когда я показываю его людям?


Обновить

Обходной путь, который я использую прямо сейчас, - это добавить дополнительный столбец в конце:

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();
Это было полезно?

Решение

Возможно, я здесь совершенно не прав, но не могли бы вы просто установить для свойства столбца только для чтения значение false?Нравится:

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

Впоследствии у вас может возникнуть проблема с типом столбца, поскольку вы пытаетесь поместить строковое значение в столбец integer.Но это должно направить вас в правильном направлении.

Редактировать:

Решение проблемы с типом столбца:

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

Другие советы

Или вы можете создать объект со всеми полями из таблицы данных, передать все данные в ваш объект и изменить его или создать поле только для чтения, которое возвращает строку в соответствии с заданным целым числом.

GridView и другие также принимают массивы объектов в качестве источников данных, поэтому это происходит автоматически.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top