gpt4 book ai didi

C#:DataTable逐行转换

转载 作者:行者123 更新时间:2023-11-30 17:21:33 25 4
gpt4 key购买 nike

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

  1. 从类中获取 SQL 查询字符串。
  2. 使用上述查询从数据库中获取 DataTable。
  3. 对 DataTable 进行转换并返回它。

在第 3 点,我克隆原始 DataTable 以更改列的类型(我不能在填充表上执行此操作,也无法在第 2 点设置它)并枚举我复制的每一行并从原始数据转换数据。转换取决于类,每个类都有自己转换数据的私有(private)方法。

问题是:如何在基类中创建一个基于以下三个参数的方法:将要转换的列名、新列的类型和转换期间的操作。第两个非常简单,但我不确定第三个。我想设计一个新的类来存储这三个参数,并且操作将存储为以下委托(delegate):

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() 我想要进行转换,这会导致大量代码重复。我想要达到的目的是创建一个基于我上面提到的参数的基类。上述解决方案是否适用于此问题,或者是否有其他方法可以解决此问题?

最佳答案

首先,我不是 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
{
}

关于C#:DataTable逐行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com