非强类型dataset VS 强类型dataset

非强类型(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一个属性)

两者对比:

 

非强类型(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,让我们的代码变得赏心悦目吧. 
类型化的 DataSet 是从DataSet 派生的类。同样,它继承 DataSet 的所有方法、事件和属性。此外,类型化的 DataSet 提供强类型的方法、事件和属性。这意味着可以按名称(而不是使用基于集合的方法)访问表和列。除了提高代码的可读性之外,类型化的 DataSet 还允许 Visual Studio .NET 代码编辑器自动填写您键入的行(代码智能提示,提高Coding的速度)。

此外,强类型的 DataSet 还允许在编译时对作为正确类型的值进行访问。通过强类型的 DataSet,将在编译代码时(而不是在运行时)捕获类型不匹配错误。 

这里以表:"EnglishName",有字段AccountID int (PrimaryKey), FirstName varchar(30),FamilyName varchar(30)进行讲述。 

第一步:生成(定义)强类型Dataset 
新建一个IDE的数据库资源管理器中新建一个连接本地Northwind库,新建表EnglishName,添加字段AccountID,FirstName varchar(30),FamilyName varchar(30)然后,在IDE中新建一个Project:Project1,添加一个新的数据集类型文件EnglishNameDS.xsd。然后把表EnglishName托抓到文件EnglishName.xsd的设计器上,IDE就自动会读取表EnglishName的schema,添加表EnglishName及它的字段,无需我们一个一个输入,极大的方便了我们的数据实体定义的速度和正确性。保存EnglishNameDS.xsd,IDE将自动生成强类型DataSet:EnglishNameDS。类EnglishNameDS从DataSet继承,拥有属性EngishName(类EngishNameDataTable ),而EngishNameDataTable[Index]返回值类型为EngishNameRow,类EngishNameRow有三个属性AccountID(int),FirstName,FamilyName(string)。可以实际操作一下,查看文件EnglishNameDS.cs。 

第二步:构造强类型Dataset:EnglishNameDS的对象 
也许有人会疑问,我该如何把从数据库表EnglishName中查询的数据转换成EnglishNameDS的一个对象呢? 

 

SqlHelper协助,会让代码变得非常简单
EnglishNameDS lds = new EnglishNameDS(); 
string sql = "Select * from EnglishName"; 
string[] tableNames = new string[]{lds.EnglishName.TableName};  
SqlHelper.FillDataset(DBConnectString, CommandType.Text, sql, lds , tableNames);

 


第三步:使用强类型Dataset:EnglishNameDS的对象 
如果想把lds 绑定到DataGrid,非常的简单: 

 

 


CREATE PROCEDURE dbo.EngishName_Insert 
 @AccountID int, 
 @FirstName nvarchar(30), 
 @FamilyName nvarchar(30) 
AS 
INSERT INTO dbo.EngishName ( 
 AccountID, 
 FirstName, 
 FamilyName 
) VALUES ( 
 @AccountID, 
 @FirstName, 
 @FamilyName 
)

 

 

 

 

IF @@ROWCOUNT = 1 
 RETURN @AccountID 
ELSE 
 RETURN -100 
GO 

EnglishName_Update:  
 CREATE PROCEDURE dbo.EngishName_Update 
 @AccountID int, 
 @FirstName nvarchar(30), 
 @FamilyName nvarchar(30) 
AS

UPDATE dbo.EngishName 
SET  
 FirstName = @FirstName, 
 FamilyName = @FamilyName 
WHERE 
 AccountID = @AccountID

IF @@ROWCOUNT = 1 
 RETURN @AccountID 
ELSE 
 RETURN -100


GO 

EnglishName_Delete: 
CREATE PROCEDURE dbo.EngishName_Delete 
 @AccountID int 
AS

DELETE FROM dbo.EngishName 
WHERE 
 AccountID = @AccountID

 

GO 


借助SqlHelper,针对Insert,Update,Delete的操作如下: 

EnglishName_InsertEnglishNameDS lds = new EnglishNameDS(); 
lds.EngishName.AddEngishNameRow(1000,"Zendy","Hu"); 
SqlHelper.ExecuteReaderTypedParams(DBConnectionString,"EnglisName_Insert",lds.EngishName[0]); 
EnglishName_UpdateEnglishNameDS lds = new EnglishNameDS(); 
lds.EngishName.AddEngishNameRow(1000,"ZendyNew","Hu"); 
SqlHelper.ExecuteReaderTypedParams(DBConnectionString,"EnglisName_Update",lds.EngishName[0]); 
EnglishName_Delete

EnglishNameDS lds = new EnglishNameDS(); 
lds.EngishName.AddEngishNameRow(1000,"",""); 
SqlHelper.ExecuteReaderTypedParams(DBConnectionString,"EnglisName_Delete",lds.EngishName[0]);

 


总结: 
借助IDE更具Table自动生成强类型Dataset,再借助CodeSmith自动生成Insert ,Update,Delete SP,达到强类型Dataset的自定义Row类(如这里的EnglishName)属性名称和数据库中的字段名 和Insert ,Update,Delete SP参数名完全的一致(这是关键之处),进而再借助SqlHelper的ExecuteReaderTypedParams,就可以完全抛弃操作数据库时需要参数赋值及字段名指定等等丑陋的代码,极大的提高了代码的一致性,可读性,可维护性,简便性,正确性,也极大的减少了代码量。 

也就是说,有了强类型的DataSet,及上面所述的使用方法,我的代码中从DA到UI都无需出现 Tables["TableName"]及Row[n]["FieldName"],终于键盘再也不需要敲入“字段名及表名”了,一切皆由自己掌控。 
(转载自:博客园)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值