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

posted on 2006-12-11 18:31  Tiu  阅读(882)  评论(0编辑  收藏  举报