C#:DataTable逐行转换

时间:2010-07-20 14:57:22

标签: c# oop datatable

在抽象类( C#3 )中,有一个名为GetData的虚方法,它返回一个DataTable。该方法的算法如下:

  1. 从课程中获取SQL查询字符串。
  2. 使用上述查询从数据库中获取DataTable。
  3. 对DataTable进行转换并将其返回。
  4. 在第3点,我克隆了原始的DataTable,以便更改列的类型(我不能在填充的表上执行此操作,并且无法在第2点设置此项)并枚举我复制的每一行并转换原始数据。转换取决于类,每个转换都有自己的私有方法来转换数据。

    问题是:如何在基类中创建一个基于以下三个参数的方法:要转换的列名,转换期间新列的类型和操作。首先是两个很简单,但我不确定第三个。我考虑过设计一个新类来存储这三个参数,并将动作存储为以下委托:

    public delegate object Convert(object objectToConvert);
    

    转换看起来像这样:

    int rowCounter = 0;
    
    foreach(DataRow row in dt.Rows)
    {
     foreach(var item in Params)
     {
      row[item.ColumnIndex] = item.Convert(originalDataTable.Rows[rowCounter].ItemArray[item.ColumnIndex]);
     }
    
     ++rowCounter;
    }
    

    现在,我必须在每个我希望进行转换的类中覆盖方法GetData(),这会导致大量的代码重复。我想要达到的目的是创建一个基于我上面提到的params的基类。以上解决方案是否适合此问题,或者是否有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

首先,我不是DataTable的忠实粉丝,如果你做了foreach,你可以使用DataReader。

using (var dataReader = ....)
    {
         while(dataReader.Read())
         {
             foreach(var item in Params)
             {
                  row[item.ColumnIndex] = item.Convert(originalDataTable.Rows[rowCounter].ItemArray[item.ColumnIndex]);
             }
         }
    }

其次,使用带有一些代码的抽象方法创建一个基类,并使列表中的对象Params继承此类,并仅在必要时覆盖该方法。

public class MyClass
{
      public abstract object Convert(DataRow row)
      {
      ....
      }
}

public class foo : MyClass
{
}

答案 1 :(得分:1)

好的,现在我有一个完全满足我的以下解决方案:

每个转换器都实现以下接口:

public interface IConvertor
{
 object Convert(object item);
}

Params 类如下:

Type ColumnType { get; protected set; } // New type
string[] ColumnNames { get; protected set; }
IConvertor Convertor { get; protected set; }

每个对象都有自己的 Params 数组属性。我为每个派生类都有一个方法,我所要做的就是设置参数。