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 回答