0

ADO.NETでは、 GetSchemaTableを使用して結果セットのスキーマテーブルを返しています。

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

残念ながら、「ProviderType」値は、 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列挙の列挙値です。

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

2 に答える 2

2

私はここから完全に離れているかもしれませんが、列のReadOnlyプロパティをfalseに設定することはできませんか?好き:

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

その後、文字列値を整数列に入れようとしているときに、列タイプの問題が発生する可能性があります。しかし、これはあなたを正しい方向に導くはずです。

編集:

列タイプの問題の解決:

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);
}
于 2009-06-23T12:18:47.307 に答える
0

または、データテーブルのすべてのフィールドを使用してオブジェクトを作成し、すべてのデータをオブジェクトに渡して変更するか、指定された整数に従って文字列を返す読み取り専用フィールドを作成することもできます。

GridViewやその他のオブジェクトもデータソースとしてオブジェクト配列を受け入れるため、自動的に実行されます。

于 2010-01-29T18:47:35.973 に答える