午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

使用強類型DataSet的好處

 遙遠(yuǎn)的橋zz 2011-04-27
在一個較大的項目中使用強類型的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ù) 引用 查看   

第一點錯誤,Typed DataSet的運行效率比untyped Dataset更低
 回復(fù) 引用   

第一點有問題,看一下Typed DataSet的代碼你會發(fā)現(xiàn),所謂強類型的屬性,只是封裝了對非類型的DataSet/DataTable/DataRow的indexer方法的調(diào)用
 回復(fù) 引用 查看   

樓主,這個帖子也太言簡意賅了吧,我在首頁看到還以為是個摘要呢……進(jìn)來本想看看詳細(xì)分析,沒想到卻沒了……
 回復(fù) 引用 查看   

Typed DataSet在某些方面運行效率還是要untyped Dataset高的,如遍歷所有datarow,還有讀取datarow中的字段。
 回復(fù) 引用 查看   

和和,沒想到帖子剛發(fā)了就這么多回復(fù),謝謝了阿。
的確,寫得太少了,因為一是工作時間不能寫太多,二是這個topic我準(zhǔn)備的也不是太多,本來計劃是一點點寫得,否則一下寫太多我也寫不動。:)
關(guān)于運行效率的問題,我覺得還是typed DataSet的好一點,因為它不用去遍歷你的datacolumn,如果你的dataSet列比較多的話,會有一點優(yōu)勢的。關(guān)于這一點,我會做一下測試。
to 遠(yuǎn)山:
模型是有的,以后會寫出來大家一起討論一下,我會盡快做完這件事的。

 回復(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ù) 引用 查看   

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

s = ds.Tables[0].Rows[0]["Col10"].ToString() ;
用key來訪問本來效率就低.
樓主用index操作試一下.

 回復(fù) 引用 查看   

剛才用index測了一下,還是type的快
600000次的時候
typeDataset: 140ms
untypeDataSet:190ms

此外,在開發(fā)的過程中,我想代碼里面是不應(yīng)該使用index這樣的東西,代碼維護(hù)不好

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多