Crystal Reports 9似乎将数据库连接信息保存在报告文件本身中。我在改变这种联系时遇到了问题。我与一组开发人员合作,他们都在同一台服务器上拥有自己的数据库副本。我们正在使用可信连接到数据库。当我们需要更改晶体报告时,我们点击闪电来执行报告,Crystal不会向数据库请求登录信息。它实际上最终连接到最后保存报告时使用的最后一个数据库。
我们想出了2个解决方法:
这些都不适合我们。有谁知道如何从报告文件中删除晶体连接?
我们已尝试注销数据源位置以及数据库专家中的所有设置。
更新
我仍然没有找到适合我案例的解决方案。但是我们最新的解决方法是加载水晶报告,然后在点击闪电之前(对数据库运行报告),拔掉以太网线。然后当Crystal找不到数据库时,重新插入以太网电缆,它将允许您选择不同的数据库服务器和名称。
答案 0 :(得分:1)
您可以在特定于用户的位置使用.dsn数据源文件(即每个用户使用相同的路径,但使用不同的物理位置)并指向Crystal Reports。例如,在每个人的C驱动器上:C:\ DSNs \ db.dsn,或者映射到每个用户的不同位置的网络驱动器。
您可以在MSDN上获取有关.dsn文件的更多信息: http://msdn.microsoft.com/en-us/library/ms710900(VS.85).aspx
答案 1 :(得分:1)
我们正在使用这种方式(但是使用sql身份验证):
您可以禁用[域用户]对dev数据库的访问权限,也应该有帮助:)
答案 2 :(得分:1)
我可能回答得太晚而无法获得赏金,但无论如何我都会提供答案。
如果您直接运行Crystal Report或使用Crystal Enterprise,那么我能想到的唯一方法是使用dsn作为paulmorriss提及。这样做的缺点是你使用的是ODBC,我认为它通常比较慢并且被认为是过时的。
如果您在应用程序中使用它,则只需更改代码中的数据库连接设置即可。然后,每个人都可以针对自己的测试数据库开发报告,并且可以在运行时将其指向生产数据库(假设开发人员数据库是最新的并且包含与生产数据库相同的字段)。
为此,您应该能够使用以下功能:
private void SetDBLogonForReport(CrystalDecisions.Shared.ConnectionInfo connectionInfo, CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument)
{
CrystalDecisions.CrystalReports.Engine.Tables tables = reportDocument.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
{
CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = table.LogOnInfo;
tableLogonInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogonInfo);
}
}
为此,您需要传入ConnectionInfo对象(包含所有登录信息)和报告文档以应用它。希望这会有所帮助。
编辑 - 我无法相信到目前为止没有想到的另一个选择是,如果您使用SQL Server,则可以确保所有开发数据库名称都是相同,然后使用“。”或“(本地)”用于服务器和集成安全性,以便每个人在本地有效地拥有相同的连接信息。我认为这可能是假设您可以让所有开发人员使用相同设置的最佳方式。
再次编辑:) 在阅读了其他答案的一些评论后,我想我可能误解了这个问题。我没有理由想到为什么你无法在没有编辑报告权利的情况下在Arvo的答案中执行这些步骤,但我假设你已经能够进行其他更改,所以我怀疑是这样的。我假设要让报告为您一直在执行这些步骤的每个开发人员工作。
答案 3 :(得分:0)
您可以在运行时设置登录。看到这个问题......
How do I change a Crystal Report's ODBC database connection at runtime?
如果您使用ODBC,则每个开发人员都可以将其DSN指向适当的数据库。基本上将连接字符串推入DSN并从晶体报告中推出。
答案 4 :(得分:0)
是的,我同意Crystal Reports很痛苦。我在构建的应用程序中遇到了同样的问题,我被迫使用它。
1-注销服务器(在水晶内部右键单击数据库并注销) 2-单击数据库并更改数据库位置
如果您已登录并更改了数据库位置,则它似乎不会粘贴