将对象转换为System.Data DataTable

时间:2015-11-22 12:06:11

标签: c# generics optimization polymorphism

因为我离完成任务还有一步之遥,所以我几乎没有陷入困境。

任务是实现一个全方位的解决方案来填充从Sql Db中获取的任何DataTable(不使用.NET ORM或任何现成的解决方案)

结构是基本的,一个表示将容纳SQL Server表的C#代码的类,以及将填充所获取的表的相应方法。

如果我知道正确的继承方法,这应该是一项简单的任务, 这就是我通过这个实现所学到的。

非常感谢您花时间尝试帮助解决这个问题!

到目前为止,我所做的几乎已经完成了:

  • DbTblmetaM是设置类型,包含获取Db表的关键信息

  • ColumnDefA是列定义,它是表格的基础

和最后一次

  • ColA是基本列模型(intCol,strCol,dateCol等')

方法如下:

public static DataTable ToDataTableTest(this DbSchema.SqlServerTables.ColumnDefA Self)
{
                // v--returns a cloned schema DataTable
    var RtDtt = GetSchemaViaDa(Self.CdefTable.Catalog, Self.CdefTable.Name);

     //use an easy expensive reflection ? 
     //or a the unknown For-loop on each TableObject.ColumnObject.itemsList "Vals"
    return;
}

我面临的问题是我无法想象我应该如何构造对象Base类,所以方法将只需要遍历其columns对象来填充任何给定的Server表。

*鉴于每个对象都已正确设置为相应地遵循其服务器表的结构

我在这里缺少什么?

更新

我问题的核心:

var someColumn1 = (Self as CdfHddFoldersFiles).FileId;

在上面的方法中,这是我现在可以访问任何服务器表列(table-Objects字段)的唯一方法。

但因为它必须适用于任何表格含义 我可以cdfSomeOthertable:ColumnDefA我需要指定每个对象的类型,这正是我现在的问题。

感谢。

//the setting type contains the key info to fetch Db Table
public class DbTablemetaM
{
    public string Catalog { get; private set; }
    public string Name { get; private set; }
    public virtual string IdenttCol { get; private set; }
    public DbTablemetaM(string bsCatalog, string bsName, string bsIdentCol)
    {
        this.Catalog = bsCatalog;
        this.Name = bsName;
        this.IdenttCol= bsIdentCol;
    }
}
public class ColumnDefA
{
    public virtual DbTablemetaM CdefTable { get; set; }
}
public class CdfHddFoldersFiles : ColumnDefA
{
    public override DbTablemetaM CdefTable
    {
        get
        {
            return base.CdefTable;
        }
        set
        {
            base.CdefTable = value;
        }
    }
    public ColsI.IntC FileId, FileSize;
    public ColsI.StrC CurFileName, DriveL, FilePath, FileExt;

    public ColsI.DateC Created;
    public CdfHddFoldersFiles()
    {
    }
}

public class ColA
{
    public virtual Type DataType { get; set; }
    public virtual string Name { get; set; }
    public virtual List<object> Vals { get; set; }
    public ColA()
    {
       this.Vals = new List<object>();
    }
}

public class ColsI
{
    public class StrC : ColA
    {
        public new String DataType;
        public new List<String> Vals { get; set; }
        public override string Name
        {
            get
            {
                return base.Name;
            }
            set
            {
                base.Name = value;
            }
        }
        public StrC()
        {
            this.Vals = new List<String>();
        }
    }

}

第二次更新:

将所需方法作为成员添加到表对象类中是我的解决方法 我现在可以完成创建适合给定表的数据的任务, 将模式克隆到DataTable,然后:

通过添加另一个成员作为DataTable,以及方法成员来执行

public override void fetchAndPopulateServerTable()
{
    this.DttToPush = this.Row.ToDataTableTest();

    var RowsFileId = this.Row.FileId.Vals;
    var RowsCurFileName = this.Row.CurFileName.Vals;
    var RowsDriveL = this.Row.DriveL.Vals;
    var RowsFilePath = this.Row.FilePath.Vals;
    for (int i = 0; i < this.Row.FileId.Vals.Count; i++)
    {
        var Nwdr = this.DttToPush.NewRow();
        Nwdr[this.Row.FileId.Name] = RowsFileId[i];
        Nwdr[this.Row.CurFileName.Name] =RowsCurFileName[i];
        Nwdr[this.Row.DriveL.Name] = RowsDriveL[i];
        Nwdr[this.Row.FilePath.Name] = RowsFilePath[i];


        this.DttToPush.Rows.Add(Nwdr);
    }
}

0 个答案:

没有答案