用C# WinForm做C/S结构程序,首先是封装的数据库访问类
public class SqlDbProvider
{
public SqlConnection GetConnection()
{
if(sqlConn == null)
{
try
{
sqlConn = new SqlConnection(connString);
sqlConn.Open();
}
catch
{
throw;
}
}
return sqlConn;
} public SqlDataReader GetDataReader(string sqlString)
{
SqlCommand cmd = new SqlCommand(sqlString,GetConnection());
try
{
return cmd.ExecuteReader(CommandBehavior.CloseConnection);   ////////////这里指定了关闭DataReader则关闭连接
}
catch
{
CloseConnection();
throw;
}
}
    ……另一处调用SqlDbProvider数据库访问类:
public SqlDataReader GetPayList()
{
SqlDbProvider data = new SqlDbProvider();
return data.GetDataReader(SQL_SELECT_PAY_LIST);
}
最后表示层窗体调用
public Void GetPayListArr()
{
PayInfo payInfo = new PayInfo();
SqlDataReader dr = payInfo.GetPayList(); string[,] payListArr = new string[3,100];
int i = 0;
while(dr.Read())
{
payListArr[0,i] = dr["Pay_Name"].ToString();
                payListArr[1,i] = dr["Pay_Formula"].ToString();
payListArr[2,i] = dr["Pay_Identity"].ToString();
i++;
}
dr.Close();  //注释1:这里关闭了DataReader
}第一次执行没问题,关闭窗体再打开,提示如下:ExecuteReader 需要打开的并且可用的连接。该连接的当前状态是 Closed是我的GetConnection()方法写得容错不好,还是最后一处dr.Close();  的问题,导致此连接关闭不彻底呢?为什么第二次运行连接没有打开呢?难道表示层窗体创建的DataReader没有得到CommandBehavior.CloseConnection参数?
唉,基础学得不好,注释1处的dr和SqlDbProvider中的DataReader实际指向同一个对象吧?
我晕……

解决方案 »

  1.   

    原来软件中有那么多的BUG都是你们这些三流的家伙,编出来的!这个不是小问题,是大问题!数据库层是这样子封装的吗?
      

  2.   

    To:zhaoyixiao
    小弟在国企刚刚转行做程序,学艺不精,请请教一下吧……不会感觉不值得您指教吧!?
      

  3.   

    public SqlConnection GetConnection()
    {
    if(sqlConn == null)
    {
    try
    {
    sqlConn = new SqlConnection(connString);
                                                  if (sqlConn.state == "Close")
                                                  {
         sqlConn.Open();
                                                   }
                                                   
    }
    catch
    {
    throw;
    }
    }
    return sqlConn;
    }
      

  4.   

    public SqlConnection GetConnection()
    {
    if(sqlConn == null)
    {
    try
    {
    sqlConn = new SqlConnection(connString);
                                                    
    }
    catch
    {
    throw;
    }
    }
                                                if (sqlConn.state == "Close")
                                                  {
         sqlConn.Open();
                                                   }
      return sqlConn;
    }
      

  5.   

    public SqlConnection GetConnection()
    {
    if(sqlConn == null)
    {
    try
    {
    sqlConn = new SqlConnection(connString);
                                                    
    }
    catch
    {
    throw;
    }
    }
                                                if (sqlConn.state == ConnectionState.Close)
                                                  {
         sqlConn.Open();
                                                   }
      return sqlConn;
    }
      

  6.   

    你干吗非要关它呢,.NET ADO 与 与以前 ADODB 不一样。没有必要关它,不关也没什么,关了也没什么。
      

  7.   

    public SqlConnection GetConnection()方法有问题
    {
    if(sqlConn == null)//问题在这,第二次如果sqlConn 不为null 那这个sqlConn 就是关闭的改为:
    if(sqlConn == null)
    {
    try
    {
    sqlConn = new SqlConnection(connString);
    sqlConn.Open();
    }
    catch
    {
    throw;
    }
    }
    else 
    {
    if (sqlConn.State==ConnectionState.Closed)
    {
    sqlConn.Open();
    }
    }
      

  8.   

    以前写程序,就一个ADO数据库连接,可是在ADO.net中,DataReader要独占一个连接,不关闭,无法进行其它操作,这样,是不是要开多个连接?
      

  9.   

    to 以前写程序,就一个ADO数据库连接,可是在ADO.net中,DataReader要独占一个连接,不关闭,无法进行其它操作,这样,是不是要开多个连接?参看
    http://blog.csdn.net/knight94/archive/2006/04/15/664530.aspx