分享

使用强类型DataSet的好处

 遥远的桥zz 2011-04-27
在一个较大的项目中使用强类型的DataSet的好处有很多,我觉得以下几点值得关注。
一: 提高运行效率。由于在编译的时候就将强类型DataSet的代码进行编译。
二: 提高开发效率。由于强类型的DataSet可以和其它类一样使用属性,方法等。列名,表名都可以利用逗点自动给出。
三:可以在xsd文件中添加codegen:nullValue属性来确保使用强类型的时候不会出现DBNULL的情况。
四:可以设定DataSet的初始值,这样就不需要另外写一个函数去初始化它。经过测试,该方法比写一个初始化方法至少快1倍以上。
但是,微软的代码自动生成工具无法设定某些类型的初始值,例如,日期,Byte等。我的做法是,写一个自动生成工具去添加剩余的。

好像没有说完吧,,,呵呵,应该描述一遍过程及自己创建生成工具的代码,最好能再和一些领域模型比较一下,看看谁更优秀,呵呵...
 回复 引用 查看   

第一点错误,Typed DataSet的运行效率比untyped Dataset更低
 回复 引用   

第一点有问题,看一下Typed DataSet的代码你会发现,所谓强类型的属性,只是封装了对非类型的DataSet/DataTable/DataRow的indexer方法的调用
 回复 引用 查看   

楼主,这个帖子也太言简意赅了吧,我在首页看到还以为是个摘要呢……进来本想看看详细分析,没想到却没了……
 回复 引用 查看   

Typed DataSet在某些方面运行效率还是要untyped Dataset高的,如遍历所有datarow,还有读取datarow中的字段。
 回复 引用 查看   

和和,没想到帖子刚发了就这么多回复,谢谢了阿。
的确,写得太少了,因为一是工作时间不能写太多,二是这个topic我准备的也不是太多,本来计划是一点点写得,否则一下写太多我也写不动。:)
关于运行效率的问题,我觉得还是typed DataSet的好一点,因为它不用去遍历你的datacolumn,如果你的dataSet列比较多的话,会有一点优势的。关于这一点,我会做一下测试。
to 远山:
模型是有的,以后会写出来大家一起讨论一下,我会尽快做完这件事的。

 回复 引用 查看   

谓强类型的属性,只是封装了对非类型的DataSet/DataTable/DataRow的indexer方法的调用
不是这样的
下面的代码是强类型的属性
public string ProductItemID {
get {
return ((string)(this[this.tableOrderItem.ProductItemIDColumn]));
}
set {
this[this.tableOrderItem.ProductItemIDColumn] = value;
}
}
代码里面直接调用指定Datatable的datacolumn,没有用到indexer。所以效率会高一些。

 回复 引用 查看   

刚才做了一下测试,的确type dataset要快一些。
把我的测试脚本贴上来,大家有不同意见可以讨论一下:
private void btnType_Click(object sender, System.EventArgs e)
{
DateTime t1;
DateTime t2;
TypeDataset10 ds = new TypeDataset10();
TypeDataset10.TestTableRow dr = ds.TestTable.NewTestTableRow();
dr.Col1 = "1";
dr.Col2 = "2";
dr.Col3 = "3";
dr.Col4 = "4";
dr.Col5 = "5";
dr.Col6 = "6";
dr.Col7 = "7";
dr.Col8 = "8";
dr.Col9 = "9";
dr.Col10 = "10";
ds.TestTable.AddTestTableRow(dr);
string s ;
int count = Convert.ToInt32(this.txtLoopTimes.Text);
t1 = DateTime.Now;
for (int i=0; i< count; i++)
{
s = ds.TestTable[0].Col10;
}
t2 = DateTime.Now;
TimeSpan ts = t2- t1;
this.lblTime.Text = ts.TotalMilliseconds.ToString() ;
}

private void btnUntyped_Click(object sender, System.EventArgs e)
{
DateTime t1;
DateTime t2;
DataSet ds = new DataSet();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
DataColumn dc1 = new DataColumn();
dc1.DataType = System.Type.GetType("System.String");
dc1.ColumnName = "Col1";
ds.Tables[0].Columns.Add(dc1);
DataColumn dc2 = new DataColumn();
dc2.DataType = System.Type.GetType("System.String");
dc2.ColumnName = "Col2";
ds.Tables[0].Columns.Add(dc2);
DataColumn dc3 = new DataColumn();
dc3.DataType = System.Type.GetType("System.String");
dc3.ColumnName = "Col3";
ds.Tables[0].Columns.Add(dc3);
DataColumn dc4 = new DataColumn();
dc4.DataType = System.Type.GetType("System.String");
dc4.ColumnName = "Col4";
ds.Tables[0].Columns.Add(dc4);
DataColumn dc5 = new DataColumn();
dc5.DataType = System.Type.GetType("System.String");
dc5.ColumnName = "Col5";
ds.Tables[0].Columns.Add(dc5);
DataColumn dc6 = new DataColumn();
dc6.DataType = System.Type.GetType("System.String");
dc6.ColumnName = "Col6";
ds.Tables[0].Columns.Add(dc6);
DataColumn dc7 = new DataColumn();
dc7.DataType = System.Type.GetType("System.String");
dc7.ColumnName = "Col7";
ds.Tables[0].Columns.Add(dc7);
DataColumn dc8 = new DataColumn();
dc8.DataType = System.Type.GetType("System.String");
dc8.ColumnName = "Col8";
ds.Tables[0].Columns.Add(dc8);
DataColumn dc9 = new DataColumn();
dc9.DataType = System.Type.GetType("System.String");
dc9.ColumnName = "Col9";
ds.Tables[0].Columns.Add(dc9);
DataColumn dc10 = new DataColumn();
dc10.DataType = System.Type.GetType("System.String");
dc10.ColumnName = "Col10";
ds.Tables[0].Columns.Add(dc10);
DataRow dr = ds.Tables[0].NewRow();
dr["Col1"] = "1";
dr["Col2"] = "2";
dr["Col3"] = "3";
dr["Col4"] = "4";
dr["Col5"] = "5";
dr["Col6"] = "6";
dr["Col7"] = "7";
dr["Col8"] = "8";
dr["Col9"] = "9";
dr["Col10"] = "10";
ds.Tables[0].Rows.Add(dr);
string s ;
int count = Convert.ToInt32(this.txtLoopTimes.Text);
t1 = DateTime.Now;
for (int i=0; i< count; i++)
{
s = ds.Tables[0].Rows[0]["Col10"].ToString() ;
}
t2 = DateTime.Now;
TimeSpan ts = t2- t1;
this.lblTime.Text = ts.TotalMilliseconds.ToString() ;
}

在600000循环的时候,typedataset的时间是130ms untypedataset是380ms


 回复 引用 查看   

ds.TestTable[0].Col10;
里面如何操作的?

s = ds.Tables[0].Rows[0]["Col10"].ToString() ;
用key来访问本来效率就低.
楼主用index操作试一下.

 回复 引用 查看   

刚才用index测了一下,还是type的快
600000次的时候
typeDataset: 140ms
untypeDataSet:190ms

此外,在开发的过程中,我想代码里面是不应该使用index这样的东西,代码维护不好

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多