因为我离完成任务还有一步之遥,所以我几乎没有陷入困境。
任务是实现一个全方位的解决方案来填充从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);
}
}