前面說了那麼多的不具體的想法和設計,今天我們就一個一個來實現它!
讓我們一起來面對一個一個問題吧!
1.底層分別使用的是什麼操作access數據庫和sqlserver數據庫的?
這個問題本是一個很麻煩的問題,我采用的是SqlHelper和AccessHelper,我也已經忘記了當初是從那 裡下,在這裡感謝原作者和漢化者。
2.你是如何把SqlDataReader和OleDbDataReader轉換為T對象並自動賦值?
對於一個未知的實體類,想要向它的屬性賦值,我用的是反射。
DbDataReader(使用父類能向下兼容)轉換為Object的關鍵代碼:
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty (reader.GetName(i));//獲取屬性
if (reader.GetValue(i) != DBNull.Value)
{
p.SetValue(obj, reader.GetValue(i), null);//屬性賦值
}
}
考慮到具體情況,具體代碼:
//處理轉化reader到object的類,方便隨後轉化為T
class ReaderHelper
{
public static object ReaderToObject(DbDataReader reader, object obj)
{
//針對CommonObject特別處理
Type t = obj.GetType();
if (t.Equals((new CommonObject()).GetType()))
{
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty("Co"+ (i+1).ToString());
if (reader.GetValue(i) != DBNull.Value)
{
p.SetValue(obj, reader.GetValue(i), null);
}
}
}
else
{
for (int i = 0; i < reader.FieldCount; i++)
{
PropertyInfo p = obj.GetType().GetProperty (reader.GetName(i));
if (reader.GetValue(i) != DBNull.Value)
{
p.SetValue(obj, reader.GetValue(i), null);
}
}
}
return obj;
}
}
注意:不可回避的是,這裡面是有限制的,也可以算是一個bug吧!需要改進!