異常處理匯總-后端系列 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; }