水晶报表的打印到打印机方法引发登录异常
本文关键字:登录 异常 方法 打印机 报表 打印 水晶 | 更新日期: 2023-09-27 18:33:18
我在我的网站上使用PrintToPrinter(1,false,1,1(作为水晶报告。单击此按钮(btnPrintToPrinter(后,它会抛出LogOnException并说数据库登录失败:
protected void btnPrintToPrinter_Click(object sender, EventArgs e)
{
int empno = Convert.ToInt32(Session["AnyVal"]);
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
string strQuery = "SELECT [View_EmplDetail].[Uni-Code], [View_EmplDetail].[FacultyCode], [View_EmplDetail].[EmpIDstr], [View_EmplDetail].[EngGivenName], [View_EmplDetail].[position_eng], [View_EmplDetail].[Emp_no], [View_EmplDetail].[GivenName], [View_EmplDetail].[position_name], [View_EmplDetail].[DariName], [Tbl_Dept].[EName], [View_EmplDetail].[photo] FROM [MoHEDatabase].[dbo].[View_EmplDetail] [View_EmplDetail] INNER JOIN [MoHEDatabase].[dbo].[Tbl_Dept] [Tbl_Dept] ON [View_EmplDetail].[DepCode]=[Tbl_Dept].[DepCode] WHERE [Emp_no] = @empno";
SqlCommand command = new SqlCommand(strQuery, connection);
command.CommandType = System.Data.CommandType.Text;
command.Parameters.AddWithValue("@empno", empno);
command.Connection = connection;
command.Connection.Open();
SqlDataAdapter da = new SqlDataAdapter(command);
DataTable dt = new DataTable();
da.Fill(dt);
ReportDocument rpt = new ReportDocument();
string _reportPath = Server.MapPath("..''Student''cardFinal.rpt");
//rpt.Load(AppDomain.CurrentDomain.BaseDirectory + "''" + @"''Student''CardFinal.rpt");
rpt.Load(_reportPath);
rpt.SetDataSource(dt);
emp_card_report_viewer.ReportSource = rpt;
string sq = "";
//{View_OrgStr1.Uni-Code}=0 and {View_OrgStr1.FacultyCode}=119
//sq = "{View_StudentAddNew.Student_ID}=" + Session["AnyVal"];
if (Session["AnyVal"].ToString() != "")
{
sq = "{View_EmplDetail.Emp_no}=" + int.Parse(Session["AnyVal"].ToString());
}
//emp_card_report.Report.FileName = "../Student/CardFinal.rpt";
emp_card_report_viewer.SelectionFormula = sq;
//ConnectionInfo connInfo = new ConnectionInfo();
//connInfo.ServerName = "172.16.0.15";
//connInfo.DatabaseName = "MoHEMISDatabase";
//connInfo.UserID = "myuser";
//connInfo.Password = "myuser@sabir";
//TableLogOnInfos crtt = new TableLogOnInfos();
//TableLogOnInfo crtto = new TableLogOnInfo();
//Tables crtables;
//crtables = rpt.Database.Tables;
//foreach (CrystalDecisions.CrystalReports.Engine.Table crtable in crtables)
//{
// crtto = crtable.LogOnInfo;
// crtto.ConnectionInfo = connInfo;
// //crtable.ApplyLogInInfo(crtto);
//}
ConnectionInfo connInfo1 = new ConnectionInfo();
// connInfo1.ServerName = "server";
setDBLOGONforReport(connInfo1);
//emp_card_report_viewer.RefreshReport();
//ConnectionInfo connInfo = new ConnectionInfo();
//connInfo.ServerName = "server";
//connInfo.DatabaseName = "MoHEDatabase";
//connInfo.UserID = "hemis_admin";
//connInfo.Password = "hemis@sabir";
//setDBLOGONforReport(connInfo);
CrystalDecisions.Shared.PageMargins pageMargins = new
CrystalDecisions.Shared.PageMargins(0, 0, 0, 0);
rpt.PrintOptions.ApplyPageMargins(pageMargins);
rpt.PrintOptions.PrinterName = printerList.SelectedItem.Value;
emp_card_report_viewer.RefreshReport();
rpt.PrintToPrinter(1, false, 1, 1);
rpt.Close();
rpt = null;
}
错误出现在 : rpt 处。打印到打印机(1,伪造酶,1,1(;
知道哪里出了问题???我已经注释掉了一些行,只是在检查它们......
任何帮助将不胜感激...TNX
幸运的是,我怀疑你的意思不是"在我编译后"它会抛出错误。我假设你的意思是"在我的 Web 应用程序中单击我的'btn打印到打印机'按钮之后"?无论如何,请更新问题以更具体地说明您如何触发错误?
如果您的"btnPrintToPrinter"按钮在您单击网页的那一刻就位于网页上,则数据库登录失败,这可能是因为您正在做两件相互矛盾的事情:
1( 首先将数据库指定为报表的数据源。-然后-2( 您正在为报告设置连接详细信息,即
ConnectionInfo connInfo1 = new ConnectionInfo();
setDBLOGONforReport(connInfo1);
删除设置连接信息的这些额外步骤。如果要将数据表推送到报表,则报表不需要连接信息。(提供报表数据后,它不会连接到服务器以再次获取数据。
注意:如果在删除这些行后仍然遇到问题。问题可能是您传递的数据表不是最初构建报表的数据表。例如:
1( 您使用名为"TableA"的表构建了报表,其中包含"字段 1"、"字段 2"和"字段 3"。2(然后,通过使用"field1","field2"和"fieldx"和"fieldz"查询"TableA",在代码中构建一个数据表。3( 将表从 #2 传递到报告中。
这可能会导致数据库登录错误(即使它不是真正的登录问题(。因为报告这样做:
1(它尝试使用您传入的数据。然后它不能,因为字段与报告的设计来源不匹配。2( 然后,没有数据的报告尝试连接到之前构建它的数据库服务器。3( 由于您没有(也不应该(将有效的连接信息传递给报告,因此它现在会抛出"数据库登录失败"。
所以你看,并不是真的因为登录失败,你就有问题了。这是因为您提供的数据(这使得报表不需要连接(是无效数据。正如我之前所说,即使一个字段不同也会使报告失败。事实上,即使只是更改单个字段的类型(例如 varchar 到 int,或 varchar(5( 到 nvarchar(10( 等(也会使您传递的数据与构建报告所基于的数据不匹配。
所以在你的页面加载事件中(我假设你设置了
我用过这个:
myReport.SetDatabaseLogon("username","password");
方法,它解决了问题。