非强类型(UnTyped)Dataset和强类型(Strong-Typed)Dataset
以表名”MyTable”,及字段 FirstName varchar(30),FamilyName varchar(30)为例
非强类型(UnTyped)Dataset 无需预先定义对应表的各个字段的属性,可以直接从查询出来的结果集(非强类型(UnTyped)Dataset)中取值例如: string lFirstName = lDs.Table["MyTable"].Rows[0]["FirstName"].ToString(); (其中lDs是类Dataset的一个对象)
强类型的(Strong-Typed)Dataset 需要预先定义对应表的各个字段的属性(需要从DataSet, DataTable, DataRow继承,生成MyDataset,MyDataTable,MyDataRow类),取值方式 例如:string lFirstName = lTypedDs.MyTable[0].FirstName;
(其中lTypedDs是类MyDataset的一个对象;
lTypedDs.MyTable是类MyDataTable的一个对象,它是MyDataset类的一个属性;
lTypedDs.MyTable[0]返回一个MyDataRow对象,它就是一个实体的具体定义类EntityObject(包括属性FirstName 和FamilyName),对应于表MyTable的Schema;
lTypedDs.MyTable[0].FirstName是String类型,它是MyDataRow一个属性)该强类型的大概伪代码如下(大家可以通过IDE环境的生产表MyDataTable对应的XSD,在通过XSD自动产生强类型Dataset:MyDataset的完整代码):
public class MyDataset : DataSet
{public MyDataset()
{
this.MyTable = new MyDataTable();
}public class MyDataTable : DataTable
{
internal DataColumn columnFirstName;
internal DataColumn columnFamilyName;
internal MyDataTable() :
base(“MyTable”)
{
this.columnFirstName = new DataColumn(“FirstName”, typeof(string), null, System.Data.MappingType.Element);
this.Columns.Add(this.columnFirstName);
this.columnFamilyName = new DataColumn(“FirstName”, typeof(string), null, System.Data.MappingType.Element);
this.Columns.Add(this.columnFamilyName);
}
public MyDataRow this[int index]
{
get {
return ((MyDataRow )(this.Rows[index]));
}
}
}
public class MyDataRow : DataRow
{
internal MyDataRow(DataRowBuilder rb) :
base(rb) {
this.tableMyTable = ((MyDataTable)(this.Table));
}
private MyDataTable tableMyTable;
public string FirstName
{
get {
return ((string)(this[this.tableMyTable.columnFirstName]));
}
set {
this[this.tableMyTable.columnFirstName] = value;
}
}
public string FamilyName
get {
return ((string)(this[this.tableMyTable.columnFamilyName]));
}
set {
this[this.tableMyTable.columnFamilyName] = value;
}
}
public MyDataTable MyTable;
}
两者对比:
非强类型(UnTyped)Dataset : | 强类型(Strong-Typed)Dataset : |
无法定义对象实体的各个属性的类型 : lDs.Table["MyTable"].Rows[0]["FirstName"] 无法未定义 |
可以定义对象实体的各个属性的类型: MyDataRow.FirstName为string类型 |
Coding时无法静态约定,只能通过TableName FieldName动态约定 : string lFirstName = lDs.Table["MyTable"].Rows[0]["FirstName"] .ToString() |
Coding时可以静态约定: string lFirstName = lTypedDs.MyTable[0].FirstName |
因为没有继承,无法提供自定义的方法属性 | 因为时自定义的Dataset,DataTable和DataRow除了父类的方法属性之外可以新增另外的方法属性 |
编译时无法进行校验(类型转换,拼写检测),只能到运行时才知道是否对错.比如无法确定”MyTable”, “FirstName”是否拼写错误等等 | 可以在编译期进行校验(类型是否匹配等等). |
你是否还在用lDs.Table["MyTable"].Rows[0]["FirstName"] .ToString()编程呢?你是否非常讨厌这些丑陋的代码? 别忧虑了,快使用强类型的Dataset,让我们的代码变得赏心悦目吧.
总之一句话: 有了强类型(Strong-Typed)Dataset ,我们的代码中永远(或几乎)不可能出现这样形式的代码:
Tables[“TableName”] .Rows[n][“FieldName”]
补充:Web开发 , ASP.Net ,