以表名"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的完整代码):
Tables[“TableName”]
Rows[n][“FieldName”]
Rows[n][“FieldName”]
我将在接下来的文章中介绍 " 如何实际使用强类型Dataset ."
public class MyDataset : DataSet
{
{
public MyDataset()
{
this.MyTable = new MyDataTable();
}
{
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;
}
{
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"是否拼写错误等等 | 可以在编译期进行校验(类型是否匹配等等). |
总之一句话: 有了强类型(Strong-Typed)Dataset ,我们的代码中永远(或几乎)不可能出现这样形式的代码:
![](https://i-blog.csdnimg.cn/blog_migrate/5c64aa3efe32baecff13eb68f1c779c4.jpeg)
评论
Duwamish里就是用的强类型,具体可以参照那里
回复
hi Neher:
谢谢你的提醒,使我及时对比了我这里所述的强类型Dataset与Duwamish中的"强类型Dataset"之间的区别, 这让我发现了我上面文章中的一个错误"不应该是lTypedDs.MyTable.Rows[0].FirstName 而应该为 lTypedDs. MyTable[0].FirstName"
关于Duwamish中的"强类型Dataset",不是真正意义上的强类型Dataset, 它返回的实体对象还是DataRow, 而不是我这里所述的MyDataRow, Duwamish中的"强类型Dataset"其实是换汤不换药, 是个假强类型Dataset, 所以它与我这里所述的有根本的区别. 敬请关注我的下一篇文章: 如何实际使用强类型的Dataset
回复
谢谢你的提醒,使我及时对比了我这里所述的强类型Dataset与Duwamish中的"强类型Dataset"之间的区别, 这让我发现了我上面文章中的一个错误"不应该是lTypedDs.MyTable.Rows[0].FirstName 而应该为 lTypedDs. MyTable[0].FirstName"
关于Duwamish中的"强类型Dataset",不是真正意义上的强类型Dataset, 它返回的实体对象还是DataRow, 而不是我这里所述的MyDataRow, Duwamish中的"强类型Dataset"其实是换汤不换药, 是个假强类型Dataset, 所以它与我这里所述的有根本的区别. 敬请关注我的下一篇文章: 如何实际使用强类型的Dataset
回复
>Duwamish中的"强类型Dataset"
一直没工夫看Duwamish等,倒也不便乱说。前段时间讨论数据访问模型的时候,一位同事给我看了一下借鉴自 Duwamish 的 DataSet,我发现那的确不算一个Typed DataSet,而是一个加入了 CURD 等数据访问逻辑(Data Access Logic )的 DataSet
所以他提出来,不如在 Typed DataSet 的基础上加入 DAL,形成类似 Duwamish 那样的 DS
个人认为不妥。
关于 Typed DataSet,记得2000-2001年好像讨论比较激烈一些,在 CodeProject 也有几篇文章专门说这事儿 :D 回复
一直没工夫看Duwamish等,倒也不便乱说。前段时间讨论数据访问模型的时候,一位同事给我看了一下借鉴自 Duwamish 的 DataSet,我发现那的确不算一个Typed DataSet,而是一个加入了 CURD 等数据访问逻辑(Data Access Logic )的 DataSet
所以他提出来,不如在 Typed DataSet 的基础上加入 DAL,形成类似 Duwamish 那样的 DS
个人认为不妥。
关于 Typed DataSet,记得2000-2001年好像讨论比较激烈一些,在 CodeProject 也有几篇文章专门说这事儿 :D 回复