在运行时更改数据库会在crdb_query.dll中引发异常 [英] Changing Database at Runtime raises exception in crdb_query.dll

查看:68
本文介绍了在运行时更改数据库会在crdb_query.dll中引发异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试通过代码结果更改报告数据库名称crdb_query.dll中的异常:
----------------- ---------------------------
 无法加载数据库信息。详细信息:无法加载数据库DLL"crdb_query.dll"。错误文件C:\DOCUME〜1\anop3\LOCALS〜1\Temp\ {68D71403-5484-4650-B960-D55DB2523564}。RPT:无法加载数据库信息
--- ------------------------------------------

?任何想法
<跨度类= "PSLONGEDITBOX"> OLE DB(ADO) - SQLNative客户端)

<跨度类= "PSEDITBOX_DISPONLY">样品代码:



   &NBSP;&NBSP;&NBSP; private ReportDocument CrystalReportObj = null ;
    protected void Page_Load( object sender,EventArgs e)
&NBSP;&NBSP;&NBSP; {
        bohelper.validate_user_session(响应, false );
    }

    protected void Page_Unload( object sender,EventArgs e)
&NBSP;&NBSP;&NBSP; {
        if (CrystalReportObj!= null
         ;&NBSP;&NBSP;&NBSP; CrystalReportObj.Dispose();
    }

    bool ApplyLogon(ReportDocument cr,ConnectionInfo ci)
    {
    TableLogOnInfo li;


    <字体颜色= "蓝色">的foreach
(CrystalDecisions.CrystalReports.Engine.Table TBL <字体颜色= "蓝色">中 cr.Database.Tables)
&NBSP;&NBSP;&NBSP ; {
    li = tbl.LogOnInfo;
    li.ConnectionInfo = ci;
    tbl.ApplyLogOnInfo(li);


    if (tbl.TestConnectivity())
    {

        if (tbl.Location.IndexOf("。")> 0)
        {
            tbl.Location =
            tbl.Location.Substring(tbl.Location.LastIndexOf()
&NBSP "";&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; + 1);
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; }
        else tbl.Location = tbl.Location;
    }
    else return false );
   &NBSP; }
    return true );
    }

    bool 登录(ReportDocument cr, string server, string db, string id, string pass)
    {
        ConnectionInfo ci = new ConnectionInfo();
        SubreportObject subObj;

        ci.ServerName = server;
        ci.DatabaseName = db;
        ci.UserID = id;
        ci.Password = pass;

        if (!ApplyLogon(cr,ci)) return false ) ;

        <字体颜色= "蓝色">的foreach (ReportObject OBJ <字体颜色= "蓝色">中
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; cr.ReportDefinition .ReportObjects)
        {
            <字体颜色= "蓝色">如果(obj.Kind ==
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; ReportObjectKind.SubreportObject)
            {
                subObj =(SubreportObject)obj;
                if
                (ApplyLogon(cr.OpenSubreport(subObj.SubreportName),
&NBSP;!&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; CI)) return false );
          ;&NBSP;&NBSP; }
        }
        return true );
    }

    public static DataSet setReportDataSource( string ReportFileName, string SQLQuery)
    {
        SqlConnection conn = null ;
        SqlDataAdapter adap = null ;
        DataSet ds = null ;

        尝试
        {
           康恩= <字体颜色= "蓝色">新的SqlConnection(bohelper.getLoginConnString());
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; ADAP = <字体颜色= "蓝色">新 SqlDataAdapter的(<字体颜色= "蓝色">新的SqlCommand(的SQLQuery));
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; ds = new DataSet();
            conn.Open();
            adap.Fill(ds,"CrystalDataset");           

            switch (ReportFileName)
            {
                <字体颜色= "蓝色">情况下 "report.rpt":
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; break ;
            }&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;
        }
        catch (例外情况)
        {

        }
        finally
        {

        }

        return ds;
    }

class ="PSEDITBOX_DISPONLY"> private void SetCurrentValuesForParameterField(ReportDocument reportDocument,String arrayName,ArrayList arrayValue)
    {
        ParameterValues currentParameterValues = new ParameterValues();
        foreach object submittedValue in arrayValue)
   ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {
            ParameterDiscreteValue parameterDiscreteValue = <字体颜色= "蓝色">新 ParameterDiscreteValue();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; parameterDiscreteValue.Value = submittedValue.ToString();
            currentParameterValues.Add(parameterDiscreteValue);
        }

        ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
        ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions [arrayName];
        parameterFieldDefinition.ApplyCurrentValues(currentParameterValues);
    }

    private ArrayList GetDefaultValuesFromParameterField(ParameterFields parameterFields)
    {
        ParameterField parameterField = parameterFields [""];
        ParameterValues defaultParameterValues = parameterField.DefaultValues;
        ArrayList arrayList = new ArrayList();
        <字体颜色= "蓝色">的foreach (的parameterValue的parameterValue <字体颜色= "蓝色">中 defaultParameterValues)
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {
            if (!parameterValue.IsRange)
            {
                ParameterDiscreteValue parameterDiscreteValue =(ParameterDiscreteValue)的parameterValue;
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; arrayList.Add(parameterDiscreteValue.Value.ToString());
            }
        }

        return arrayList;
    }
    <字体颜色= "蓝色">保护 <字体颜色= "蓝色">空隙 crystalReportViewer_AfterRender(<字体颜色= "蓝色">对象源,CrystalDecisions.Web.HtmlReportRender.AfterRenderEvent e)
    {
    
    }
}

class ="PSEDITBOX_DISPONLY">
类 =" PSEDITBOX_DISPONLY">&NBSP;&NBSP;&NBSP; private void Page_Init( object sender,EventArgs e)
&NBSP;&NBSP;&NBSP; {
        ConfigureCrystalReports();
    }

class ="PSEDITBOX_DISPONLY">
    private void ConfigureCrystalReports()
    {
 
                reportPath ="report.rpt";
                CrystalReportObj = <字体颜色= "蓝色">新的ReportDocument();
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP; CrystalReportObj.Load(reportPath);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;登录(CrystalReportObj, "DBNAME", "用户", "PWD" "");&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;

               
                Response.ClearContent();
                Response.ClearHeaders();
                Response.ContentType ="application / pdf";
                CrystalReportObj.ExportToHttpResponse(ExportFormatType.PortableDocFormat,响应,<字体颜色= "蓝色">假, "report.pdf");
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; Response.Flush();
                Response.Close();
               
    }

 

trying to change the report database name by code result on a exception in crdb_query.dll:
--------------------------------------------
 Failed to load database information. Details: The database DLL 'crdb_query.dll' could not be loaded. Error in File C:\DOCUME~1\anop3\LOCALS~1\Temp\{68D71403-5484-4650-B960-D55DB2523564}.rpt: Failed to load database information.
---------------------------------------------

Any idea?
(
OLE DB (ADO) - SQLNative Client )

Sample Code:



       private ReportDocument CrystalReportObj = null;
    protected void Page_Load(object sender, EventArgs e)
    {
        bohelper.validate_user_session( Response, false);
    }

    protected void Page_Unload(object sender, EventArgs e)
    {
        if (CrystalReportObj != null)
            CrystalReportObj.Dispose();
    }

    bool ApplyLogon(ReportDocument cr, ConnectionInfo ci)
    {
    TableLogOnInfo li;


    foreach (CrystalDecisions.CrystalReports.Engine.Table tbl in cr.Database.Tables)
    {
    li = tbl.LogOnInfo;
    li.ConnectionInfo = ci;
    tbl.ApplyLogOnInfo(li);



    if (tbl.TestConnectivity())
    {

        if (tbl.Location.IndexOf(".") > 0)
        {
            tbl.Location =
            tbl.Location.Substring(tbl.Location.LastIndexOf(".")
            + 1);
        }
        else tbl.Location = tbl.Location;
    }
    else return (false);
    }
    return(true);
    }


    bool Logon(ReportDocument cr, string server, string db, string id, string pass)
    {
        ConnectionInfo ci = new ConnectionInfo();
        SubreportObject subObj;

        ci.ServerName = server;
        ci.DatabaseName = db;
        ci.UserID = id;
        ci.Password = pass;

        if (!ApplyLogon(cr, ci)) return (false);

        foreach (ReportObject obj in
        cr.ReportDefinition.ReportObjects)
        {
            if (obj.Kind ==
            ReportObjectKind.SubreportObject)
            {
                subObj = (SubreportObject)obj;
                if
                (!ApplyLogon(cr.OpenSubreport(subObj.SubreportName),
                ci)) return (false);
            }
        }
        return (true);
    }

    public static DataSet setReportDataSource(string ReportFileName, string SQLQuery)
    {
        SqlConnection conn = null;
        SqlDataAdapter adap = null;
        DataSet ds = null;

        try
        {
            conn = new SqlConnection(bohelper.getLoginConnString());
            adap = new SqlDataAdapter(new SqlCommand(SQLQuery));
            ds = new DataSet();
            conn.Open();
            adap.Fill(ds, "CrystalDataset");           

            switch (ReportFileName)
            {
                case "report.rpt":
                    break;
            }           
        }
        catch (Exception ex)
        {

        }
        finally
        {

        }

        return ds;
    }

class
="PSEDITBOX_DISPONLY"> private void SetCurrentValuesForParameterField(ReportDocument reportDocument, String arrayName, ArrayList arrayValue)
    {
        ParameterValues currentParameterValues = new ParameterValues();
        foreach (object submittedValue in arrayValue)
        {
            ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue();
            parameterDiscreteValue.Value = submittedValue.ToString();
            currentParameterValues.Add(parameterDiscreteValue);
        }

        ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields;
        ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[arrayName];
        parameterFieldDefinition.ApplyCurrentValues(currentParameterValues);
    }

    private ArrayList GetDefaultValuesFromParameterField(ParameterFields parameterFields)
    {
        ParameterField parameterField = parameterFields[""];
        ParameterValues defaultParameterValues = parameterField.DefaultValues;
        ArrayList arrayList = new ArrayList();
        foreach (ParameterValue parameterValue in defaultParameterValues)
        {
            if (!parameterValue.IsRange)
            {
                ParameterDiscreteValue parameterDiscreteValue = (ParameterDiscreteValue)parameterValue;
                arrayList.Add(parameterDiscreteValue.Value.ToString());
            }
        }

        return arrayList;
    }
    protected void crystalReportViewer_AfterRender(object source, CrystalDecisions.Web.HtmlReportRender.AfterRenderEvent e)
    {
    
    }
}
class="PSEDITBOX_DISPONLY">
class="PSEDITBOX_DISPONLY">    private void Page_Init(object sender, EventArgs e)
    {
        ConfigureCrystalReports();
    }

class="PSEDITBOX_DISPONLY">
    private void ConfigureCrystalReports()
    {
 
                reportPath = "report.rpt";
                CrystalReportObj = new ReportDocument();
                CrystalReportObj.Load(reportPath);

                Logon(CrystalReportObj, ".", "dbname", "user", "pwd");                                               

               
                Response.ClearContent();
                Response.ClearHeaders();
                Response.ContentType = "application/pdf";
                CrystalReportObj.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, "report.pdf");
                Response.Flush();
                Response.Close();
               
    }

 

推荐答案

原因是您通过OLE DB将报告的登录信息设置到数据库服务器,但是您也尝试使用DS并将其设置为报告。

The cause is you are setting logon info for the report to the DB server via OLE DB but then you are trying to use a DS also and setting it to the report also.

使用报告引擎无法做到这一点。您必须使用RAS和ReplaceConnection方法。包含在VS中的CR在VS 2010的CR之前不支持此功能。

Can't do that using the report engine. You have to use RAS and the ReplaceConnection method. CR included with VS does not support this until CR for VS 2010.

要么直接点击数据库,要么手动打开报告并将位置设置到DS,保存报告然后只需为您的DS设置位置,无需为报告设置数据库位置。

Either stay with hitting the DB directly or open your reports manually and set location to your DS, save the report and then just set location to your DS, no need to set location to DB for the report.

请参阅以下示例以获取更多帮助:

See these samples for more help:

企业样本(包括托管和非托管ras)

http: //wiki.sdn.sap.com/wiki/display/BOBJ/Business+Objects+SDK+Sample+Applications

Enterprise Samples (including managed and unmanaged ras)
http://wiki.sdn.sap.com/wiki/display/BOBJ/Business+Objects+SDK+Sample+Applications

非企业样本

http://wiki.sdn.sap.com/wiki/ display / BOBJ / Crystal + Reports + SDK + Sample + Applications

导出样本(RAS)

http://wiki.sdn.sap.com/wiki/displa y / BOBJ / NET + RAS + SDK +样本#NETRASSDKSamples-Exporting%2FPrinting

Don


这篇关于在运行时更改数据库会在crdb_query.dll中引发异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆