#iis #operating-system #crystal-reports #odbc
Вопрос:
Мы создали веб-службу в .NET для экспорта отчета crystal в pdf, и она работает, как и ожидалось, на машине разработки, но при развертывании с использованием IIS на рабочем сервере появляется ошибка «Не удалось войти в базу данных».
Ниже приведен код, разработанный для экспорта отчета crystal в pdf
public class CryRepWebService : System.Web.Services.WebService { [WebMethod] public string InvoiceReportCry(int Invoiceid, int docType, string Proj) { string project; int docTypes; int InvoiceIds; try { ReportDocument cryRpt = new ReportDocument(); cryRpt.Load(Server.MapPath("~/Reports/myreport.rpt")); string USERNAME = "useruser";//Default user Name string PWD = "pwdpwd$";//Default pwd Name string DSN_NAME = "mydsn"; string INITIAL_CATALOG = "dbname"; string serverName = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINESOFTWAREODBCODBC.INI" DSN_NAME, "Server", null); cryRpt.SetDatabaseLogon(USERNAME, PWD, serverName, INITIAL_CATALOG); // create the connection information ConnectionInfo conRpt = new ConnectionInfo(); conRpt.ServerName = serverName; conRpt.DatabaseName = INITIAL_CATALOG; conRpt.UserID = USERNAME; conRpt.Password =PWD; // apply connection information to the report tables Tables rptTables = cryRpt.Database.Tables; for (int i = 0; i lt; rptTables.Count; i ) { CrystalDecisions.CrystalReports.Engine.Table rptTable = rptTables[i]; TableLogOnInfo tblInfo = rptTable.LogOnInfo; tblInfo.ConnectionInfo = conRpt; // next table } // if the report contains sub reports, you will need to set the connection info there too if (cryRpt.Subreports.Count gt; 0) { for (int i = 0; i lt; cryRpt.Subreports.Count; i ) { using (ReportDocument rptSub = cryRpt.OpenSubreport(cryRpt.Subreports[i].Name)) { Tables rptTables1 = rptSub.Database.Tables; for (int j = 0; j lt; rptTables.Count; j ) { CrystalDecisions.CrystalReports.Engine.Table rptTable = rptTables1[i]; TableLogOnInfo tblInfo = rptTable.LogOnInfo; tblInfo.ConnectionInfo = conRpt; // next table } rptSub.Close(); } } } ParameterValues crParameterValues = new ParameterValues(); ParameterDiscreteValue crParameterDiscreteValue = new ParameterDiscreteValue(); ParameterDiscreteValue crParameterDiscreteValue1 = new ParameterDiscreteValue(); ParameterDiscreteValue crParameterDiscreteValue2 = new ParameterDiscreteValue(); cryRpt.SetParameterValue("@Invoiceid", Invoiceid); cryRpt.SetParameterValue("@docType", docType); cryRpt.SetParameterValue("@Proj", Proj); project = Proj; docTypes = docType; InvoiceIds = Invoiceid; bool folderExists = Directory.Exists(@"D:CrystalReportsTest_Pdf"); if (!folderExists) Directory.CreateDirectory(@"D:CrystalReportsTest_Pdf"); cryRpt.ExportToDisk(ExportFormatType.PortableDocFormat, @"D:CrystalReportsTest_Pdftest-" Invoiceid ".pdf"); return project InvoiceIds docTypes; } catch (Exception ex) { ExceptionLogging.SendErrorToText(ex); return null; } } }
Ниже приведены технические характеристики обеих сред:
Система Разработки :
Windows 7 Professional (64-bit) Visual Studio 2015 Sql Server 2012 ODBC Driver - Sql Server SAP Crystal Reports 2016 (SP6) (version 14.2.6.2839) SAP Crystal Reports runtime engine for .NET Framework(64-bit)(version 13.0.30.3805) SAP Crystal Reports, version for Microsoft Visual Studio (version 13.0.30.3805) IIS (7.5)
Рабочий Сервер:
Windows Server 2012 R2 Standard (64-bit) Visual Studio 2015 Sql Server 2019 ODBC Driver - Sql Server Native Client 10.0 SAP Crystal Reports 2016 (SP4) (version 14.2.4.2410) SAP Crystal Reports 2016 (SP9) update (version 14.2.9.3791) SAP Crystal Reports runtime engine for .NET Framework(64-bit) (version 13.0.30.3805) SAP Crystal Reports, version for Microsoft Visual Studio (version 13.0.30.3805) IIS (8.5)
Пожалуйста, кто-нибудь, помогите нам с решением, чтобы попробовать.
Заранее спасибо.
Марути А
Комментарии:
1. «Сбой входа в базу данных» — учетные данные для БД в порядке?
2. ДА. Более того, проверено открытие того же .rpt в Crystal designer с указанием значений параметров и ожидаемого результата.
Ответ №1:
Попробуйте включить 32-разрядные приложения в пуле приложений сервера IIS.
- Откройте диспетчер IIS и нажмите на Пул приложений в левом окне.
- Щелкните правой кнопкой мыши пул приложений, для которого вы хотите включить 32-разрядные приложения, и выберите в контекстном меню пункт Дополнительные настройки.
- В окне Дополнительных настроек найдите
Enable 32-Bit Applications
свойство, установите для него значение True и нажмите кнопку ОК.
Комментарии:
1. Спасибо @samwu. Попробовал предлагаемое изменение, но никаких изменений (проблема все еще существует).
2. Ваш источник данных ODBC 32-разрядный или 64-разрядный?
3. Источник данных ODBC (системный DSN) является 32-разрядным.