ExecuteReader在執行有輸出參數的存儲過程時拿不到輸出參數


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM