Crystal Report Viewer持续要求登录,如何修改服务器及数据库信息?
解决Crystal Report Viewer持续要求登录的问题
我太懂你现在的抓狂了——明明代码里已经传了数据集,Crystal Report Viewer却一直弹登录框,完全不知道该怎么改服务器和数据库配置对吧?别着急,这种情况大多是报表自带的连接配置在“捣乱”,或者你的数据集和报表的表信息不匹配导致的,下面给你几个落地的解决办法:
一、先清理报表自带的数据源配置
打开你的CrystalReport1.rpt文件:
- 在字段资源管理器里找到「数据库字段」,右键点击之前绑定的原始数据源(比如你可能直接连了SQL Server里的PersonalInformation表),选择「删除」
- 右键点击「数据库字段」→「添加/移除数据库」,选择「项目数据」→「数据集」,把你代码里用到的DataSet绑定到报表上,确保报表所有字段都来自这个数据集,而不是直接连接数据库
二、确保数据集表名和报表表名完全匹配
看你代码里的这段:
sda.Fill(dst, "employeesinformation");
你把查询结果填充到了名为employeesinformation的DataTable里,但如果你的报表里绑定的表名是PersonalInformation(和SQL查询的表名一致),两者名称不匹配会导致报表找不到数据,进而触发登录提示。
你可以把代码改成:
sda.Fill(dst, "PersonalInformation");
或者在报表里把数据源的表名改成employeesinformation,总之两者必须完全一致。
三、代码强制覆盖报表登录信息(顽固情况用)
如果报表还是死磕原始连接,你可以在代码里手动给每个表设置连接凭据,直接覆盖报表自带的配置:
修改后的完整代码示例:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using CrystalDecisions.CrystalReports.Engine; using System.Data.SqlClient; using CrystalDecisions.Shared; // 务必添加这个命名空间 namespace WindowsFormsApplication1 { public partial class print : Form { SqlConnection con = config.getConnection(); ReportDocument crypt = new ReportDocument(); public print() { InitializeComponent(); } private void print_Load(object sender, EventArgs e) { con.Open(); SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM PersonalInformation", con); DataSet dst = new DataSet(); // 确保表名和报表内的表名完全一致 sda.Fill(dst, "PersonalInformation"); crypt.Load(@"C:\Users\ASPIRE\Documents\mao ni\WindowsFormsApplication1\WindowsFormsApplication1\CrystalReport1.rpt"); // 手动设置报表连接信息 ConnectionInfo connectionInfo = new ConnectionInfo(); connectionInfo.ServerName = "你的SQL服务器名称"; // 替换成实际服务器名,比如localhost或.\SQLEXPRESS connectionInfo.DatabaseName = "你的数据库名称"; // 验证方式二选一:Windows验证就开IntegratedSecurity,SQL验证填账号密码 connectionInfo.IntegratedSecurity = true; // connectionInfo.UserID = "SQL账号"; // connectionInfo.Password = "SQL密码"; // 遍历报表所有表,应用新的连接信息 foreach (Table table in crypt.Database.Tables) { TableLogOnInfo tableLogOnInfo = table.LogOnInfo; tableLogOnInfo.ConnectionInfo = connectionInfo; table.ApplyLogOnInfo(tableLogOnInfo); } crypt.SetDataSource(dst); crystalReportViewer1.ReportSource = crypt; crystalReportViewer1.Refresh(); con.Close(); } } }
注意:
- 一定要添加
CrystalDecisions.Shared命名空间,否则ConnectionInfo和TableLogOnInfo会报错 - 根据你的数据库验证方式调整参数:Windows身份验证就把
IntegratedSecurity设为true,不用填账号密码;SQL Server验证就填对应账号密码,把IntegratedSecurity设为false
建议先试前两个方法,大部分情况都能解决,要是还不行再用第三个方法强制覆盖。
内容的提问来源于stack exchange,提问作者mhalditaCpunk
相关产品推荐
相关产品推荐

