異常處理匯總-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html
后期會在博客首發更新:http://dnt.dkill.net/Article/Detail/312
今天一同志問我這個問題,這個是過程還原:
調用SQLHelper的時候發現輸出參數沒值了???

不用sqlhelper也是沒有?神馬情況?

用sqldataadapter卻可以?


嚇死寶寶了,趕緊看看啥情況。先換種方法看看

,,,我去,可以哇!那么是不是ExecuteReader容易有啥坑的問題呢?想了想,對頭,是不是返回的reader有點問題?

先關了看看~我去,有值了!不會這么容易就搞定了吧?不行,得再試試

~~的確,reader沒關閉,那輸出參數就沒值(其實也可以理解~reader說:本大王還沒讀取完呢,你丫急什么,給我等着)

不能就這樣算了啊,我不能總自己寫吧,sqlhelper的問題還是得解決

我去,還是沒有。。。。。。。這可不行,看看sqlhelper的源碼怎么搞的

萬惡的清除啊!再試試

居然可以了,ok,收工了?來來來,我們繼續看看

SQLHelper怎么寫的?

額,經常聽前輩說SqlDataAdapter是個神奇的東西,果然...
擴:一般很少直接返回SqlDataReader對象的,

貼一個比較弱的轉換(有更好的可以貼評論中的,我就先拋個磚頭)
public static IEnumerable<T> SqlDataReaderToList<T>(SqlDataReader reader) where T : new()
{
using (reader)
{
if (reader.HasRows)
{
IList<T> list = new List<T>();
while (reader.Read())
{
T t = new T();
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
string tempName = pi.Name;
//設置 RowFilter
reader.GetSchemaTable().DefaultView.RowFilter = string.Format("ColumnName='{0}'", tempName);
//判斷SqlDataReader是否存在某列
if (reader.GetSchemaTable().DefaultView.Count > 0)
{
if (!pi.CanWrite)
{
continue;
}
var value = reader[tempName];
if (value != DBNull.Value)
{
pi.SetValue(t, value, null);
}
}
}
list.Add(t);
}
return list;
}
}
return null;
}
