五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > DataReader轉(zhuǎn)換為List的一種實現(xiàn)

DataReader轉(zhuǎn)換為List的一種實現(xiàn)

文章來源:365jz.com     點擊數(shù):294    更新時間:2009-09-13 10:50   參與評論

標(biāo)題似乎有些不專業(yè),但是相信好多人都知道是怎么回事,開發(fā)中最常見的數(shù)據(jù)操作就是DataReader=>IList<T> 了,當(dāng)然使用ORM框架的話就不用為這個煩惱了。在Google上沒找到一個完整的解決方案,但是自己總結(jié)了網(wǎng)上說的,寫了一個還算滿意的方案。

通常我們會有一個實體類,這個實體類只有屬性與數(shù)據(jù)庫字段對應(yīng),例如:

QQ截圖未命名 

                                   (截圖不完整)

如何讓DataReader轉(zhuǎn)換呢?我寫了一個擴展方法(由于是重構(gòu)代碼),擴展實體類使之增加一個方法

以擴展上圖的QuestionAnswerInfo為例:

QQ截圖未命名2

 

上圖中CreateQusetionAnswerInfo方法之所以能做到通用,也就是說不管查詢?nèi)我饨M合的某些字段都能正確賦值關(guān)鍵是IDataRecord的

public static T Field<T>(this IDataRecord record, string fieldName) 的擴展方法,它可以保證沒有查詢的字段和查詢了但是返回時NULL的字段對應(yīng)實體類的屬性

設(shè)置為默認值

該方法的實現(xiàn)如下:

public static T Field<T>(this IDataRecord record, string fieldName)
{
T fieldValue = default(T);
for (int i = 0; i < record.FieldCount; i++)
{
if (string.Equals(record.GetName(i), fieldName,StringComparison.OrdinalIgnoreCase))
{
if (record[i] != DBNull.Value)
{
fieldValue = (T)record[fieldName];
}
}
}
return fieldValue;
}

呵呵,這個IDataRecord的擴展有點像Linq to DataSet中得到字段值的操作了。另外IDataReader是繼承了IDataRecord所以這個擴展方法IDataReader也可以使用。

有個上面的兩個擴展方法之后,還需要一個對IDataReader的擴展,代碼如下:

public static IEnumerable<T> GetEnumerator<T>(this IDataReader reader,
Func<IDataRecord, T> generator)
{
while (reader.Read())

yield return generator(reader);
}

實現(xiàn)都很簡單,下面看看如何使用(代碼片段):

using (IDataReader dr = _db.ExecuteReader(command))
{
questionAnswerList = dr.GetEnumerator<QuestionAnswerInfo>(new QuestionAnswerInfo().CreateQuestionAnswerInfo).ToList();
}

使用時注意:一定要注意Select語句中查詢字段名稱一定要和對用實體類的屬性名稱一樣。

補充:圖2中QuestionAnswerInfo實體類的擴展CreateQuestionAnswerInfo方法的實現(xiàn)書寫起來也是比較費事,可以自己寫一個代碼生成的方法生產(chǎn)代碼

具體到我這里代碼如下:

    public string CodeDump<T>()
{
string result = string.Empty;
System.Reflection.PropertyInfo[] properties = typeof(T).GetProperties();
foreach (System.Reflection.PropertyInfo item in properties)
{
result += string.Format("{0} = record.Field<{1}>(\"{0}\"),", item.Name, item.PropertyType.FullName);
}
return result;
}

使用也很簡單呀,弄一個aspx頁面,在頁面上放在一個TextBox控件,Page_Load方法中調(diào)用上面的方法給TextBox賦值就可以了

TextBox1.Text = CodeDump<QusetionItemInfo>();然后把TextBox中的值復(fù)制過去,編輯器自動幫你排好版了。

Tag標(biāo)簽: asp.net,datareader轉(zhuǎn)換list

如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇

發(fā)表評論 (294人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號