在一个较大的项目中使用强类型的DataSet的好处有很多,我觉得以下几点值得关注。
一: 提高运行效率。由于在编译的时候就将强类型DataSet的代码进行编译。 二: 提高开发效率。由于强类型的DataSet可以和其它类一样使用属性,方法等。列名,表名都可以利用逗点自动给出。 三:可以在xsd文件中添加codegen:nullValue属性来确保使用强类型的时候不会出现DBNULL的情况。 四:可以设定DataSet的初始值,这样就不需要另外写一个函数去初始化它。经过测试,该方法比写一个初始化方法至少快1倍以上。 但是,微软的代码自动生成工具无法设定某些类型的初始值,例如,日期,Byte等。我的做法是,写一个自动生成工具去添加剩余的。 好像没有说完吧,,,呵呵,应该描述一遍过程及自己创建生成工具的代码,最好能再和一些领域模型比较一下,看看谁更优秀,呵呵... 回复 引用 查看 |
|
回复 引用
回复 引用 查看
回复 引用 查看
回复 引用 查看
的确,写得太少了,因为一是工作时间不能写太多,二是这个topic我准备的也不是太多,本来计划是一点点写得,否则一下写太多我也写不动。:)
关于运行效率的问题,我觉得还是typed DataSet的好一点,因为它不用去遍历你的datacolumn,如果你的dataSet列比较多的话,会有一点优势的。关于这一点,我会做一下测试。
to 远山:
模型是有的,以后会写出来大家一起讨论一下,我会尽快做完这件事的。
回复 引用 查看
不是这样的
下面的代码是强类型的属性
public string ProductItemID {
get {
return ((string)(this[this.tableOrderItem.ProductItemIDColumn]));
}
set {
this[this.tableOrderItem.ProductItemIDColumn] = value;
}
}
代码里面直接调用指定Datatable的datacolumn,没有用到indexer。所以效率会高一些。
回复 引用 查看
把我的测试脚本贴上来,大家有不同意见可以讨论一下:
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
回复 引用 查看
里面如何操作的?
s = ds.Tables[0].Rows[0]["Col10"].ToString() ;
用key来访问本来效率就低.
楼主用index操作试一下.
回复 引用 查看
600000次的时候
typeDataset: 140ms
untypeDataSet:190ms
此外,在开发的过程中,我想代码里面是不应该使用index这样的东西,代码维护不好