运行时更改 Crystal Report 数据库凭据和登录值





4.00/5 (3投票s)
如何在运行时更改 Crystal Report 的数据库服务器名、数据库名、密码、用户 ID 等
引言
本文旨在帮助初学者解决他们最常问的问题之一:如何在 WinForm 应用程序中运行时更改 Crystal Report 的数据库登录值。
背景
我曾在一个 WinForm 应用程序中工作,该应用程序包含 100 多个 Crystal Report,这些报告使用 CrystalReportViewer 在 WinForm 中显示。我的数据库位于生产服务器上,但在部署时,我被迫更改数据库服务器名。因此,我开发了这段代码。
使用代码
步骤 1:我将所有登录凭据作为静态变量放置在 Program.cs 中
static class Program
{ public static String ConnStr = "";
public static String OurReportSource = "";
public static String OurLogSource = "";
public static String OurImagelocation = "";
public static String database = "";
public static String Server = "";
public static String dbUsername = "";
public static String dbPassword = "";
public static int USERPK;
public static String UserType;
public static int LOCTNPK;
public static String UserName;
public static String LOCATIONCODE;
public static String EmpName;
public static DateTime Datetoday=DateTime.Now ;
public static Transactions.DatabasePicker databasepcker = null;
public static int usernampk;
[STAThread]
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
databasepcker = new Transactions.DatabasePicker();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
databasepcker.SetConnctionString();
Application.Run(new MainForm());
}
}
步骤 2:然后,我创建了一个名为 DBKey 的文本文件,该文件存储在客户端机器的 C 驱动器中,并创建了一个类来从该 DBKey 文件中读取值。
class DatabasePicker
{
private const string FILE_NAME = "C:\\DBkey.txt";
public void SetConnctionString()
{
if (!File.Exists(FILE_NAME))
{
DialogResult dialogResult = MessageBox.Show(
"Database configuration file not found Do you want to Reset it ? ",
"Database Key not Found", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "Text|*.txt|All|*.*";
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
String Sourcefile = openFileDialog1.FileName;
File.Copy(Sourcefile, "c:\\DBkey.txt");
MessageBox.Show("Data Key Recieved", "Data Key");
SetConnctionString();
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message, "Data Key");
}
}
}
else if (dialogResult == DialogResult.No)
{
Application.Exit();
}
}
else
{
string line;
// Read the file and display it line by line.
System.IO.StreamReader file =
new System.IO.StreamReader("c:\\DBkey.txt");
string[] lines = File.ReadAllLines("c:\\DBkey.txt"); //File is in System.IO
string firstLine = lines[1]; //constring
string secondline = lines[2]; //reportlocation
string ThirdLine = lines[3]; //log
string FourthLine = lines[4]; //images
string fifthline = lines[5]; //servername
string sixthline = lines[6]; //databasename
string seventhline = lines[7]; //userid
string eightline = lines[8];//password
Program.ConnStr = firstLine;
Program.OurReportSource = secondline;
Program.OurLogSource = ThirdLine;
Program.OurImagelocation = FourthLine;
Program.Server = fifthline;
Program.database = sixthline;
Program.dbUsername = seventhline;
Program.dbPassword = eightline;
}
}
上述代码在我的先前技巧中得到了清晰的解释,关于从 Txt 文件读取连接字符串:https://codeproject.org.cn/Tips/796507/ConnectionString-for-Winform-and-Reportsource-from
步骤 3:重要步骤 >> 创建一个类来设置 Crystal Report 的登录值,并使用一个函数 getreport(),该函数返回给定报告位置的 Crystal Report 的 ReportDocument。
public static class Logonvalues { public static ReportDocument getpeport(String ReportLocation) { ConnectionInfo crconnectioninfo = new ConnectionInfo(); ReportDocument cryrpt = new ReportDocument(); TableLogOnInfos crtablelogoninfos = new TableLogOnInfos(); TableLogOnInfo crtablelogoninfo = new TableLogOnInfo(); Tables CrTables; cryrpt.Load(ReportLocation); cryrpt.DataSourceConnections.Clear(); crconnectioninfo.ServerName = Program.Server; crconnectioninfo.DatabaseName = Program.database; crconnectioninfo.UserID = Program.dbUsername ; crconnectioninfo.Password = Program.dbPassword; CrTables = cryrpt.Database.Tables; foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables) { crtablelogoninfo = CrTable.LogOnInfo; crtablelogoninfo.ConnectionInfo = crconnectioninfo; CrTable.ApplyLogOnInfo(crtablelogoninfo); } return cryrpt; }
请注意,在使用新的登录值分配之前,清除报告文档的数据源位置非常重要。
cryrpt.DataSourceConnections.Clear();
步骤 4:最后,我们将从包含 CrystalReportViewer 的窗体中调用登录值。
public void loadreport() { Crvt_ApplicationReport.ReportSource = Logonvalues..getpeport(Program.OurReportSource + \\LeaveApplicationForm"); Crvt_ApplicationReport.SelectionFormula= "{LeaveApplicationMaster.LeaveAppPk}=" +selectionid ; Crvt_ApplicationReport.RefreshReport(); }
最后,您需要确保在客户端系统上安装了 Crystal Report 可再发行包,并且您系统的 DBKey 指向正确的凭据。
关注点
可以通过将 loadreport 函数也放在一个类中,并将 CrystalReportViewer 名称以及所需的报告和选择公式作为参数传递来进行进一步的代码减少。此外,我们可以使用其他方法来分配登录值,例如 XML 实体对象等,而不是文本文件。
历史
在此处保持您所做的任何更改或改进的实时更新。