惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
H
Heimdal Security Blog
K
Kaspersky official blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Schneier on Security
G
GRAHAM CLULEY
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
C
Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - Franky
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Jina AI
Jina AI
P
Proofpoint News Feed
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog
IT之家
IT之家
S
Security Affairs
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
N
News | PayPal Newsroom
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
W
WeLiveSecurity
The Last Watchdog
The Last Watchdog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
NISL@THU
NISL@THU

博客园 - Tiu

2010走了,又是一年,留个脚印 Commerce Server 2007 随笔一 2009眨眼间过去了,留个纪念 asp.net ajax随笔二 asp.net中慎用static全局变量 asp.net ajax随笔一 收集的关于依赖注入及Unity application block入门的一些资料 2008最后一篇:总结与展望 文件操作类简介 防止页面在提交的过程中多次点击按钮 第一次使用SQLCLR C#网络编程随笔一 装AJAX.NET 1.0的环境,我遇到个问题,进来解答下 关于邮件群发 XML学习一 asp.net窗中的两个Form问题 URL重写入门 动态从数据库中选择Top 个数 编写类和子程序的几个原则
关于在数据层返回SqlDataReader
Tiu · 2006-12-11 · via 博客园 - Tiu

    今天在写程序的时候,把数据访问层大换血了,我把要调用的存储过程名和需要的参数名称都弄到所谓的“业务逻辑层”,其实我写的只是一个小的网站内容管理系统,也分不多清楚,只觉得这样好点,如果您有好的方法,欢迎指点下。
    然后我在数据层里就只编写操作数据库的方法:包括初始化数据的连接、返回DataSet的方法、返回ExecuteNonQuery() 执行后的结果还有返回一个SqlDataReader的方法,这几个方法的参数就是存储过程名称和参数数组,下面我把我写的返回数据集的方法列在下面:

        /// <summary>
        
/// 返回指定的DataSet
        
/// </summary>
        
/// <param name="sql">存储过程名称</param>
        
/// <param name="cmdParameter">参数</param>
        
/// <returns>数据集DataSet</returns>
        public DataSet ExecuteDataSet(string sql,IDataParameter[] cmdParameter)
        {
            
using(SqlConnection myConnection=GetSqlConnection())
            {
                DataSet ds
=new DataSet();
                SqlDataAdapter sqlDa
=new SqlDataAdapter(sql,myConnection);
                sqlDa.SelectCommand.CommandType
=CommandType.StoredProcedure;
                
foreach (IDataParameter p in cmdParameter)
                {
                    
if (p!=null)
                    {
                        sqlDa.SelectCommand.Parameters.Add(p);
                    }
                }
                myConnection.Open();
                sqlDa.Fill(ds);
                myConnection.Close();
                
return ds;
            }
        }

这里就不都做解释了,相信大家一看就明白GetSqlConnection() 是我自己写的,返回一个 new SqlConnection(数据库连接字符串)。
    要跑题了,:)。下面说返回SqlDataReader的方法,一开始我就按上面的写法,return一个SqlDataReader对象,可是捕获到异常,说reader已关闭。(是自己太菜了,一开始不知道,随着数据库连接的关闭,SqlDataReader 也关闭了,要想得到SqlDataReader 就必须与数据库一直保持链接,所以就像我开始的时候什么值都得不到)。我就把返回SqlDataReader方法改了改,不使用using语句了,在这也不把数据库的链接关闭了,这样用:

SqlDataReader reader=sqlCmd.ExecuteReader(CommandBehavior.CloseConnection);

这句的意思就是数据库的连接会随着DataReader对象的关闭而关闭,这样就可以调用完这个方法,用完reader后调用reader.Close(),这样子就OK了。