none
如何捕捉水晶报表抛出的异常啊 RRS feed

  • 问题

  • 我在存储过程中.用raiserror("这是我写的错误信息") 抛出错误

    而水晶报表调用这个存储过程.  我在asp.net中用CrystalReportViewer来展示水晶报表,

    可是当水晶报表报错时. 在asp.net中用Try捕捉不了.

     只会显示很模糊的文字: 你的数据库检索出错,   错误代码出现在showOrder.rpt中

    而我需要在页面上显示我在 存储过程中用raiserror("这是我写的错误信息") 抛出来的错误信息.


    学习者
    2009年9月8日 12:06

答案

  • -- 你的 RAISERROR 在 Sql 中 catch 掉了,所以 .net 代码捕获不到,你的代码可以简化为下面的方式
    IF NOT OBJECT_ID('UP_GetRecordByPage1') IS NULL 
        DROP PROCEDURE UP_GetRecordByPage1
    GO
    CREATE PROCEDURE [dbo].[UP_GetRecordByPage1] @nRole INT
    AS 
    BEGIN
        IF ( @nRole > 10 ) 
            RAISERROR ( '查询2009-07-01之前的历史数据请到EIP-运营报表统计中查询,新报表平台只提供2009-07-01之后的数据' , 18 , 1 )
        SELECT * FROM  dbo.RolePopedom
    END

    知识改变命运,奋斗成就人生!
    2009年9月10日 1:49
    版主

全部回复

  • 你好,首先在 ASP.NET 是可以捕获的,可能是你的存储过程有问题,比如你在存储过程中使用了 Try Catch 又没有显示的抛出异常。如果未能解决你的问题,你可以帖出你的代码部分。
    知识改变命运,奋斗成就人生!
    2009年9月9日 1:17
    版主
  • 楼主.. 事情紧急.  麻烦你留下你的联系方式好吗?

      最好是QQ或电话..   

     存储过程

        ALTER PROCEDURE [dbo].[UP_GetRecordByPage1]
    @nRole int
    as

    BEGIN TRY

    if(@nRole > 10)
    begin

    raiserror('查询2009-07-01之前的历史数据请到EIP-运营报表统计中查询,新报表平台只提供2009-07-01之后的数据', 18, 1)
    select * from dbo.RolePopedom
    end

    else
    begin
    select * from dbo.RolePopedom
    end
    END TRY

    BEGIN CATCH

           -- 错误处理

           SELECT

                  ERROR_MESSAGE()  -- 返回warning
    select * from dbo.RolePopedom
    END CATCH



    代码:


    try
            {
                   //加载报表
                        string sPath = Server.MapPath(CurrReportItems.Path);
                        m_objRptDocument.Load(sPath);
                    //赋予参数值
                            foreach (string sKey in m_dicKeyValues.Keys)
                            {
                             
                                m_objRptDocument.SetParameterValue(sKey, m_dicKeyValues[sKey]);
                            }
                   //  绑定数据源
                    crReportViewer.ReportSource = m_objRptDocument;
              }

    catch (Exception ex)
            {

              这里捕捉不到.
               
           }


    学习者
    2009年9月9日 1:44
  • -- 你的 RAISERROR 在 Sql 中 catch 掉了,所以 .net 代码捕获不到,你的代码可以简化为下面的方式
    IF NOT OBJECT_ID('UP_GetRecordByPage1') IS NULL 
        DROP PROCEDURE UP_GetRecordByPage1
    GO
    CREATE PROCEDURE [dbo].[UP_GetRecordByPage1] @nRole INT
    AS 
    BEGIN
        IF ( @nRole > 10 ) 
            RAISERROR ( '查询2009-07-01之前的历史数据请到EIP-运营报表统计中查询,新报表平台只提供2009-07-01之后的数据' , 18 , 1 )
        SELECT * FROM  dbo.RolePopedom
    END

    知识改变命运,奋斗成就人生!
    2009年9月10日 1:49
    版主
  •  XXY   一开始就是采用这种方式的. 没有用.  水晶报表不会报错.  它会在内部消化掉这一错误.   

    这种方式的结果:   .net  的 try  捕获不到,    水晶报表不会显示数据,  只能显示几个很模糊的提示: 你的数据库检索出错,   错误代码出现在showOrder.rpt中
    学习者
    2009年9月10日 6:08