【问题标题】:.NET: How to change the value in a DataTable.NET:如何更改 DataTable 中的值
【发布时间】:2010-01-30 02:47:35
【问题描述】:

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

【问题讨论】:

    标签: data-binding gridview ado.net schema oledb


    【解决方案1】:

    我可能完全不在此处,但您不能将列的 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);
    }
    

    【讨论】:

    • 我希望数据行的数组值可能是对象,我可以在其中填充不同类型的对象。
    • 你是对的:它失败了。 “FormatException:输入字符串的格式不正确。”
    • 我添加了一小段代码,应该可以帮助您解决列类型问题。
    • 看起来答案是“您无法更改 DataTable 中的值”。作为一种解决方法,您可以Cloned 表。
    【解决方案2】:

    或者您可以使用数据表中的所有字段创建一个对象,将所有数据传递到您的对象并对其进行修改,或者创建一个只读字段,该字段根据给定的整数返回字符串。

    GridView 和其他也接受对象数组作为数据源,因此它是自动的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2016-06-01
      • 2018-11-29
      • 2011-04-15
      • 2020-04-22
      • 1970-01-01
      相关资源
      最近更新 更多