今天在写程序的时候,把数据访问层大换血了,我把要调用的存储过程名和需要的参数名称都弄到所谓的“业务逻辑层”,其实我写的只是一个小的网站内容管理系统,也分不多清楚,只觉得这样好点,如果您有好的方法,欢迎指点下。
然后我在数据层里就只编写操作数据库的方法:包括初始化数据的连接、返回DataSet的方法、返回ExecuteNonQuery() 执行后的结果还有返回一个SqlDataReader的方法,这几个方法的参数就是存储过程名称和参数数组,下面我把我写的返回数据集的方法列在下面:
要跑题了,:)。下面说返回SqlDataReader的方法,一开始我就按上面的写法,return一个SqlDataReader对象,可是捕获到异常,说reader已关闭。(是自己太菜了,一开始不知道,随着数据库连接的关闭,SqlDataReader 也关闭了,要想得到SqlDataReader 就必须与数据库一直保持链接,所以就像我开始的时候什么值都得不到)。我就把返回SqlDataReader方法改了改,不使用using语句了,在这也不把数据库的链接关闭了,这样用:
然后我在数据层里就只编写操作数据库的方法:包括初始化数据的连接、返回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(数据库连接字符串)。/// 返回指定的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;
}
}
要跑题了,:)。下面说返回SqlDataReader的方法,一开始我就按上面的写法,return一个SqlDataReader对象,可是捕获到异常,说reader已关闭。(是自己太菜了,一开始不知道,随着数据库连接的关闭,SqlDataReader 也关闭了,要想得到SqlDataReader 就必须与数据库一直保持链接,所以就像我开始的时候什么值都得不到)。我就把返回SqlDataReader方法改了改,不使用using语句了,在这也不把数据库的链接关闭了,这样用:
SqlDataReader reader=sqlCmd.ExecuteReader(CommandBehavior.CloseConnection);
这句的意思就是数据库的连接会随着DataReader对象的关闭而关闭,这样就可以调用完这个方法,用完reader后调用reader.Close(),这样子就OK了。