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对象的,
贴一个比较弱的转换(有更好的可以贴评论中的,我就先抛个砖头)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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 ; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异