在一個較大的項目中使用強類型的DataSet的好處有很多,我覺得以下幾點值得關(guān)注。
一: 提高運行效率。由于在編譯的時候就將強類型DataSet的代碼進(jìn)行編譯。 二: 提高開發(fā)效率。由于強類型的DataSet可以和其它類一樣使用屬性,方法等。列名,表名都可以利用逗點自動給出。 三:可以在xsd文件中添加codegen:nullValue屬性來確保使用強類型的時候不會出現(xiàn)DBNULL的情況。 四:可以設(shè)定DataSet的初始值,這樣就不需要另外寫一個函數(shù)去初始化它。經(jīng)過測試,該方法比寫一個初始化方法至少快1倍以上。 但是,微軟的代碼自動生成工具無法設(shè)定某些類型的初始值,例如,日期,Byte等。我的做法是,寫一個自動生成工具去添加剩余的。 好像沒有說完吧,,,呵呵,應(yīng)該描述一遍過程及自己創(chuàng)建生成工具的代碼,最好能再和一些領(lǐng)域模型比較一下,看看誰更優(yōu)秀,呵呵... 回復(fù) 引用 查看 謂強類型的屬性,只是封裝了對非類型的DataSet/DataTable/DataRow的indexer方法的調(diào)用
不是這樣的 下面的代碼是強類型的屬性 public string ProductItemID { get { return ((string)(this[this.tableOrderItem.ProductItemIDColumn])); } set { this[this.tableOrderItem.ProductItemIDColumn] = value; } } 代碼里面直接調(diào)用指定Datatable的datacolumn,沒有用到indexer。所以效率會高一些。 回復(fù) 引用 查看 剛才做了一下測試,的確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循環(huán)的時候,typedataset的時間是130ms untypedataset是380ms 回復(fù) 引用 查看 剛才用index測了一下,還是type的快
600000次的時候 typeDataset: 140ms untypeDataSet:190ms 此外,在開發(fā)的過程中,我想代碼里面是不應(yīng)該使用index這樣的東西,代碼維護(hù)不好 |
|