第一个问题:
我使用的是EXCEL模板进行输出打印处理,在模板中设置了特殊的标记进行替换。但是有些页面(不固定)经常会莫名其妙的失效,也就是无法替换标记以输出正确的内容。以前就碰到过好多次这种状况,但是一般都是把模板中出现问题的那个页面删除掉重新做一个相同的就又可以用了;这一次又出现这种情况,无论我重做多少次都没有办法解决,请教一下为什么会出现这种状况呢?又应该如何解决这个问题?
还有一种情况就是同一个模板页面中其他的标记都替换成功,但是惟独有2个一直无法替换(调用的方法、标记格式、读取的要替换的内容等都和其他标记没有区别),请教一下为什么会出现这个问题呢?第二个问题:
这个是关于datareader连接数据库无法关闭导致数据库连接数过多而出现错误的问题。我以前因为是在自己本机上测试用户少所以未发现这个问题,但是移植到客户那边之后因为用户数量比较多(整个机关内)就会经常出现页面出错的状况。经过反复排查才发现是因为数据库中连接数超出的问题。我把代码发上来给大家看一下,请帮忙想一个解决的方法,多谢!
页面后台调用基类dataAccess中的方法来获取一个dataReader:
string sqlStr = "select * from table";
//检查是dataReader是否为空,如果不为空就关闭datareader
CheckReader();
//执行查询并填充datareader
dataAccess.RunCommand(sqlStr, out dataReader);
//把读取的值赋给页面上的控件
if (dataReader.Read())
{
//把值赋给页面上的控件
}
//关闭dataReader
dataReader.Close();
基类dataAccess中返回一个dataReader的函数:
/// <summary>
/// Run SQL command.
/// </summary>
/// <param name="CommandText">Command of SQL.</param>
/// <param name="dataReader">Return result of Command.</param>
public void RunCommand(string CommandText, out SqlDataReader dataReader) 
{
// SqlCommand cmd = new SqlCommand(CommandText,conn);
// dataReader = cmd.ExecuteReader();
SqlDataReader dr = null; try
{
openConnection();
comm.CommandType = CommandType.Text ;
comm.CommandText = CommandText; dr = comm.ExecuteReader( CommandBehavior.CloseConnection ); 
}
catch(Exception ex)
{
dr.Close();
closeConnection();
throw new Exception(ex.Message);
} dataReader = dr ;
}关于第二个问题,因为系统中使用dataReader的地方太多(起码过百),所以要改为dataset的话工作量过大,时间上不允许,所以只能寻求解决在关闭dataReader时无法关闭数据库连接的问题,请大家多多帮忙!!!
谢谢!

解决方案 »

  1.   

    try 

    openConnection(); 
    comm.CommandType = CommandType.Text ; 
    comm.CommandText = CommandText; dr = comm.ExecuteReader( CommandBehavior.CloseConnection ); 

    catch(Exception ex) 

    dr.Close(); 
    closeConnection(); 
    throw new Exception(ex.Message); 

    finally{
    dr.close();
    closeConnection(); 
    }
      

  2.   

    將關閉寫在 finally 中
    dr.Close(); 
    closeConnection(); 
    try 

      openConnection(); 
      comm.CommandType = CommandType.Text ; 
      comm.CommandText = CommandText;   dr = comm.ExecuteReader( CommandBehavior.CloseConnection ); 

    catch(Exception ex) 
    { throw new Exception(ex.Message); 

    finally

       dr.Close(); 
      closeConnection(); 
    }
      

  3.   

    to palm_java and oec2003:请教一下如果在finally里边把dr关闭的话,那在调用这个函数并返回一个datareader时还怎么去取值呢?
    就是说在执行:dataAccess.RunCommand(sqlStr, out dataReader);
    //把读取的值赋给页面上的控件
    if (dataReader.Read())
    {
    //把值赋给页面上的控件
    }
    //关闭dataReader
    dataReader.Close(); 这段代码时是要百分之百出错的。
      

  4.   

    datareader 是一直连接的 所以每用一次就得关闭
      

  5.   

    1.excel有2列不可以  是不是数据格式不一样? 比如有的添加的数字,有的添的是文字。
    那样的话 加个imex属性
    2。datareader  用完就释放就行了。
    在使用的时候 ds添就可啊。
      

  6.   

    楼上 
    datareader 可能会读取出错 然后 会出异常的就无法正常释放了1. 使用 using 语句 using(SqlDataReader dr = DataAccessHelper.ExecuteReader(....)) using 会自动调用 dispose() 方法 Reader 的 dispose 会自己关闭连接 你查.net 源代码可以看到2. try catch finally 语句
    try 

      openConnection(); 
      comm.CommandType = CommandType.Text ; 
      comm.CommandText = CommandText;   dr = comm.ExecuteReader( CommandBehavior.CloseConnection ); 

    catch(Exception ex) 
    { throw new Exception(ex.Message); 

    finally

       dr.Close();        /// 这之前其实最好判断连接状态,  否则还是有可能出错的 几率小而已
      closeConnection();  //这句话无意义的
    }
      

  7.   

    关闭有这么复杂吗?finally 之后还会异常?