You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:38:25