遇到这样一个问题:添加互评信息,断点调试,跳转到BLL层后就直接跳到SqlHelper中弹出错误,说:未将对象设置引用到实例等。还请人帮忙调试代码,调试半天发现抽象工厂并没成功完成反射,奇怪的是:将出现问题的方法中换用反射其他的接口没有问题,后来将有问题的接口和DAL层类都重写了,问题好像解决了。所以添加互评就这么实现了,结果实现查询操作的时候问题重现了,我逐步调试,发现这样一个问题,调试到抽象工厂类,会发现这个问题:ServerVersion 引发了“System.InvalidOperationException”类型的异常。
如果您跟我一样使用SqlHelper了,你可以这样试着解决下问题:看一下你SqlHelper类中的方法是否正常使用了Try…Catch…,我的这个问题就是因为SqlHelper中Try…Catch…使用不正确,打开的数据库连接并没正常关闭。
出现问题的带参数sql查询语句或存储过程
#region 执行带参数的查询SQL语句或存储过程 /// <summary> /// 执行带参数的查询SQL语句或存储过程 /// </summary> /// <param name="cmdText">查询SQL语句或存储过程</param> /// <param name="paras">参数集合</param> /// <param name="ct">命令类型</param> public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct) { try { //定义并实例化DataTable表 DataTable datResult = new DataTable(); //实例化SqlCommand sqlCmd = new SqlCommand(cmdText, GetConn()); //传来的SqlCommand类型:存储过程、sql语句等 sqlCmd.CommandType = ct; //添加参数 sqlCmd.Parameters.AddRange(paras); using (sdr = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection)) { datResult.Load(sdr); } //返回数据表 return datResult; } catch { //没有数据返回空值 return null; } finally { //关闭记录集 sdr.Close(); //关闭数据库 sqlConn.Close(); } } #endregion
修改后的sql查询语句或存储过程
#region 执行带参数的查询SQL语句或存储过程 /// <summary> /// 执行带参数的查询SQL语句或存储过程 /// </summary> /// <param name="cmdText">查询SQL语句或存储过程</param> /// <param name="paras">参数集合</param> /// <param name="ct">命令类型</param> public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct) { //实例化一个Datatable对象 DataTable dt = new DataTable(); //创建一个连接 sqlCmd = new SqlCommand(cmdText, GetConn()); //指定命令类型 sqlCmd.CommandType = ct; //给该命令传入参数 sqlCmd.Parameters.AddRange(paras); //将查询出来的记录放入dt中 using (sdr = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection)) { //将SqlDataReader中的记录放入dt中 dt.Load(sdr); //关闭阅读器 sdr.Close(); } //关闭数据库连接 Close(); //返回DataTable return dt; } #endregion
小学问,大道理。try…catch…的作用影响很大的……