首页 > 解决方案 > C# Loinging DataTable 和基于数据类型的格式化值

问题描述

我在 DataTable 中获取查询结果,需要将 DataTable 中的整数和日期格式化为特定格式。由于某些限制,我无法在 SQL Server 中对其进行格式化。

我已经编写了下面的代码来格式化它,但它没有更新 DataTable。

public DataTable formatDT(DataTable DT)
{
    string datatype, columnName;
    decimal sysInt;
    DateTime DateTime;
    int r = 0;
    foreach (DataRow dr in DT.Rows)
    {
        for (int i = 0; i < DT.Columns.Count; i++)
        {
            columnName = DT.Columns[i].ColumnName;
            if (DT.Columns[i].ColumnName.ToString() == "full_count")
            {
                continue;
            }
            datatype = Convert.ToString(DT.Columns[i].DataType);
            switch (datatype)
            {
                case "System.Int":
                case "System.Int32":
                case "System.Int64":
                    sysInt = Convert.ToInt32(dr[columnName]);
                    DT.Rows[r][columnName] = sysInt.ToString("N0");
                    break;

                case "System.DateTime":
                    DateTime = Convert.ToDateTime(dr[columnName]);
                    DT.Rows[r][columnName] = DateTime.ToString("yyyy-MM-dd");
                    logger.Error(DT.Rows[r][columnName] + "<<<>>>>" + DateTime.ToString("yyyy-MM-dd"));      //Even after assing 'DT.Rows[r][columnName]' is shows old values and not the formatted one
                    break;

                case "System.Decimal":
                case "System.Double":
                    sysInt = Convert.ToInt32(dr[columnName]);
                    DT.Rows[r][columnName] = sysInt.ToString("N2");
                    break;
                default:
                    DT.Rows[r][columnName] = dr[columnName].ToString();
                    break;
            }
        }
        r++;
    }
    DT.AcceptChanges();
    return DT;
} 

任何帮助表示赞赏。

标签: c#c#-datatable

解决方案


  1. 这是为了提醒您,如果您正在迭代DataTableusing foreach,则无法修改或更新其值或类型。C# 不允许这样做。相反,您可以做的是声明另一个DataTable并尝试向其中添加行并返回它。这就是我认为您在第二种方法中已经完成的操作,就像您的回答一样。
  2. 或者,您可以System.Reflection将此表作为List使用或返回。跟下面一样。
   public static List<T> MakeList<T>(System.Data.DataTable tble)
        {
            return tble.AsEnumerable().Select(row =>
                {
                    var properties = typeof(T).GetProperties();
                    var ob = Activator.CreateInstance<T>();
                    foreach (var pro in properties)
                    {
                        try
                        {
                           //Here you can apply your conversion
                            pro.SetValue(ob, row[pro.Name] != null 
                                ? row[pro.Name].ToString() : string.Empty);
                        }
                        catch (Exception e) { throw e; }
                    }
                    return ob;
                }).ToList();
        }

只需创建一个DataTable列类并像这样传递该类的对象。为了

class example{
public a{get;set;}
public b {get;set;}
}

List<example> ls = MakeList<example>(dt);
  1. 如何更改数据表中数据列的数据类型?

推荐阅读