如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了)

上一篇文章深度对比 非强类型(UnTyped)Dataset和强类型(Strong-Typed)Dataset》可以由下面这段MSDN中的一段文本加以进一步补充说明:
类型化的 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_Insert EnglishNameDS lds = new EnglishNameDS();
lds.EngishName.AddEngishNameRow(1000,"Zendy","Hu");
SqlHelper.ExecuteReaderTypedParams(DBConnectionString,"EnglisName_Insert",lds.EngishName[0]);
EnglishName_Update EnglishNameDS 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"],终于键盘再也不需要敲入“字段名及表名”了,一切皆由自己掌控。

dataGrid1.SetDataBinding(lds.EnglishName,"");
如果想要获取第一条记录的Firstname,就可以这样:
string firstName = lds.EnglishName[0].FirstName.


第四步: 使用强类型Dataset:EnglishNameDS的对象,进行Insert,Update,Delete操作。
首先利用Codesmith生成SP:
EnglishName_Insert:

posted on 2005-05-13 22:50 Zendy 阅读(2478) 评论(14)   编辑  收藏 引用 收藏至365Key 所属分类: DataAccess


#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-05-14 09:20 ZendyHu
To:春鱼

在IDE环境中,新建一个数据集文件(.xsd),然后拖入一张表到该文件的设计器界面,IDE自动产生了XSD定义(xml格式),我不知道,这个自动产生的定义和你所说的"为什么不使用xsd定义"有没有区别? 如果有区别或者"为什么不使用xsd定义"是指另外有更好定义数据集文件(xsd)的方式,请告诉, 谢谢!   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-05-14 11:15 huangyi
哪个版本的sqlhelper能支持强类型的dataset的啊 我用的好象不行   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-05-14 11:35 Onlyuser
那如果库中的表结构改变了,岂不是要重新根据XSD来生成ds类以及SP?   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-05-14 20:07 风之浪漫
感觉灵活性上受到了限制。。对于数据库是动态绑定的不太好使呀!~   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-02 16:08 vic
請問樓主
SqlHelper.ExecuteDatasetTypedParams(conn,"SPX_GetTabOwnerRole",tds.TabSetting[0]);
所傳回來的ds並不支援Strong-Typed)Dataset
請問樓主如何處理! 感謝..   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-02 16:36 ZendyHu
to VIC:
请查看本文中,第二步的实例代码。就可以得到强类型的Dataset :)


   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-02 18:05 vic
谢谢楼主回覆!
请楼主指点我以下用法是否正确,
// 1. 一般只有一个参数的SP
public RoleDS GetTabOwnerRole(int tabID)
{

string[] tableName = new string[]{rds.Roles.TableName};
SqlHelper.FillDataset(conn,"SPX_GetTabOwnerRole",rds,tableName,tabID);
// 传一个tabID 变数传入SP
return rds;
}
//2. SP有多个参数
SqlParameter[] sps;
sps = SqlHelperParameterCache.GetSpParameterSet(Conn,"SPX_GetTabTest");
sps[0].Value = sMACCHINA;
sps[1].Value = sMERGE;



SqlParameter[] sps;
sps = SqlHelperParameterCache.GetSpParameterSet(conn,"SPX_GetTabTest");
sps[0].Value = 1;
sps[1].Value = 1;

TabSettingDS tabDS = new TabSettingDS();

string[] tableNames = new string[]{tabDS.TabSetting.TableName};
SqlHelper.FillDataset(conn,"SPX_GetTabTest",tabDS,tableNames,sps);
return tabDS;

   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-02 21:00 vic
更正一下有打错的地方
//2. SP有多个参数
SqlParameter[] sps;
sps = SqlHelperParameterCache.GetSpParameterSet(conn,"SPX_GetTabTest");
sps[0].Value = 1;
sps[1].Value = 1;

TabSettingDS tabDS = new TabSettingDS();

string[] tableNames = new string[]{tabDS.TabSetting.TableName};
SqlHelper.FillDataset(conn,"SPX_GetTabTest",tabDS,tableNames,sps);
return tabDS;    回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-03 08:28 ZendyHu
to Vic : you are right now !
   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-10 17:47 m1z1@163.com
我想问一下,我在DATASET.XSD中增加了一个数据库中存在的表ftebtrans,又添加了一个element mingx。然后在.aspx 页面中引用该数据集,为何看不到我添加的element?我该如何引用该element?正常可以用myadapt1.Fill(myds1, "ftebtrans"),没错;但是myadapt1.Fill(myds1, "mingx"),编译时报 表或者视图不存在。请指点,谢谢!   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-11 11:58 ZendyHu
to: m1z1

可否把你的想要的需求 和具体的出错过程 说明的更详细一点?不然我真的无法帮助你!   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-15 15:12 piggybank
我用 Typed DataSet 仅仅是配合我的 Entity Object class,在某些场合,例如数据绑定等。
在 Entity Object 的 DAO 中提供了一个方法,能将 Typed Entity Collection 和 Entity 在 Typed DataSet 之间转换。

我想,这样可能会更好一些。

最后的模式有点像 2000年那会儿微软一哥们提出的 E-C-C 模式:
Engine(DAO)-Collection-Class
只是在我这里变成了
Engine(BizLogic class 继承自 DAO)-Typed Collection(继承自EntityCollection)-EntityObject Class(继承自Entity Model Class)
然后外加 Typed DataSet 用于某些支持 DataBind 或者需要序列化的场合
好处是 EntityObject 仅仅关心 OO 层次的东东,由 Model 或 Typed DataSet 实现对数据结构的支持和存储(Structure),BizObject 可以继承或聚合复用对应的类型化的 DAO,从而提供包含对 Entity 的 CURD 在内的数据访问逻辑和业务逻辑。
最后,Model 和 DAO 对 OO 层和BL而言是不可见的,仅仅处理数据访问和CURD等DAL。Typed DataSet 实际上和它们俩在同一层次。

最近有点忙,有空多多交流吧   回复
  

#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-06-18 14:07 Zendy
To :piggybank

Ok,以后有空多多交流。目前在我的项目中都是 以TypedRow作为实体类,TypedTable作为 Collection,TypedDataset作为 multi Collection :)   回复 
 
#  re: 如何实际使用强类型Dataset(键盘再也不需要敲入表名和字段名了) 2005-05-14 03:21 春鱼
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值