標(biāo)題似乎有些不專業(yè),但是相信好多人都知道是怎么回事,開發(fā)中最常見的數(shù)據(jù)操作就是DataReader=>IList<T> 了,當(dāng)然使用ORM框架的話就不用為這個煩惱了。在Google上沒找到一個完整的解決方案,但是自己總結(jié)了網(wǎng)上說的,寫了一個還算滿意的方案。
通常我們會有一個實體類,這個實體類只有屬性與數(shù)據(jù)庫字段對應(yīng),例如:
(截圖不完整)
如何讓DataReader轉(zhuǎn)換呢?我寫了一個擴展方法(由于是重構(gòu)代碼),擴展實體類使之增加一個方法
以擴展上圖的QuestionAnswerInfo為例:
上圖中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ù)制過去,編輯器自動幫你排好版了。
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇