我正在使用....
Framework 3.5 C#Visual Studio 2008和基于Web的应用程序
我使用数据集创建了报告,即我的服务为我提供了数据集,并且我将该数据集与报告绑定在一起。
但有时CR查看器开始弹出错误“登录失败”,登录信息集名称填写登录信息。
我正在寻找它的解决方案很长一段时间,但对此没有任何合适的答案。
答案 0 :(得分:3)
您是否在代码中传递了凭据:
ReportDocument rep = new ReportDocument();
rep.FileName = Server.MapPath("CrystalReport1.rpt");
set.SetDatabaseLogon("username", "password", "sql-server", "database"); // this line pass the login parameters required for login
答案 1 :(得分:3)
遗憾的是,这个错误含糊不清,因为它是数十个无关问题的生成错误。在这种情况下,“登录失败”可能是由于偶尔的架构不匹配造成的。
DataSet对象可以包含分层数据。 如果您的服务返回包含分层数据的DataSet,并且某些子项丢失,则其架构已有效更改。
有几种方法可以确保DataSet具有匹配的架构。如果要将对象序列化为XML,然后从该XML生成DataSet,那么实现一致架构的一种简单方法是从以下位置更改代码:
reportData.ReadXml(new MemoryStream(Encoding.UTF8.GetBytes(reportXml)));
到
reportData.ReadXmlSchema(schemaPath);
reportData.ReadXml(
new MemoryStream(Encoding.UTF8.GetBytes(reportXml)),
XmlReadMode.IgnoreSchema
);
其中,schemaPath指向通过调用
在开发中生成的XSD文件File.WriteAllText(
@"C:\MyTempPath\MyReportName.xsd",
reportData.GetXmlSchema(),
Encoding.Unicode
);
生成模式时,您还希望该模式尽可能完整地表示数据,因此您需要尽可能使用完整的数据层次结构。这也是必须创建报告以使其模式匹配的XML。如果架构发生更改,则必须在设计器中使用新数据打开报表,并且必须“验证数据库”,然后保存RPT文件。
答案 2 :(得分:2)
经过长时间的努力,我想到了主要原因,我的存储过程中存在一个错误,即返回数据。
SP从table1或table2返回数据(它们都具有相同的结构),但是当我从table2中选择数据时,我没有写出所需的所有列名。
看起来很奇怪,我应该得到像找不到列错误而不是数据库登录失败的东西。
答案 3 :(得分:1)
试一试。还要确保在所有地方都有正确版本的水晶报告
private ConnectionInfo crConnectionInfo = new ConnectionInfo();
ReportDocument rpt = new ReportDocument();
protected void Page_Load(object sender, EventArgs e)
{
CrystalReportViewer1.Width = 900;
CrystalReportViewer1.ToolPanelView = ToolPanelViewType.None;
BindReport();
}
private void BindReport()
{
rpt.Load(Server.MapPath("ProductList.rpt"));
DataSet ds = getReportData();
rpt.SetDataSource(ds.Tables[0]);
CrystalReportViewer1.ReportSource = rpt;
}
private DataSet getReportData()
{
DataSet ds = new DataSet();
string ConnectionString = ConfigurationManager.ConnectionStrings["myconn"].ConnectionString;
SqlConnection con = new SqlConnection(ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "GetProductList";
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
cmd.Connection = con;
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(ds, "ctable");
con.Close();
return ds;
}
答案 4 :(得分:1)
我修复它的方法是为应用程序创建一个新的应用程序池。我将新应用程序池用户IIS APPPOOL\applicationpoolname
的权限授予应用程序中使用的SQL Server数据库。
然后错误就消失了。
我的假设是,CR运行时并不总是使用通过代码应用的userlogininfo,而是使用IIS用户登录信息。