用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实际指向同一个对象吧?
我晕……
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实际指向同一个对象吧?
我晕……
小弟在国企刚刚转行做程序,学艺不精,请请教一下吧……不会感觉不值得您指教吧!?
{
if(sqlConn == null)
{
try
{
sqlConn = new SqlConnection(connString);
if (sqlConn.state == "Close")
{
sqlConn.Open();
}
}
catch
{
throw;
}
}
return sqlConn;
}
{
if(sqlConn == null)
{
try
{
sqlConn = new SqlConnection(connString);
}
catch
{
throw;
}
}
if (sqlConn.state == "Close")
{
sqlConn.Open();
}
return sqlConn;
}
{
if(sqlConn == null)
{
try
{
sqlConn = new SqlConnection(connString);
}
catch
{
throw;
}
}
if (sqlConn.state == ConnectionState.Close)
{
sqlConn.Open();
}
return sqlConn;
}
{
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();
}
}
http://blog.csdn.net/knight94/archive/2006/04/15/664530.aspx