2009-06-09 178 views
4

Crystal Reports 9似乎将数据库连接信息保存在报告文件本身内。我遇到了更改该连接的问题。我与一组开发人员合作,他们在同一台服务器上拥有自己的数据库副本。我们使用可信连接到数据库。当我们需要更改水晶报表时,我们点击闪电执行报表,Crystal不会向数据库要求登录信息。它实际上最终会连接到最后保存报告时使用的最后一个数据库。Crystal Reports 9数据库连接问题

我们想出了2个解决方法:

  1. 接招晶认为它应该连接到离线数据库,然后结晶会要求登录信息。
  2. 删除正在进行水晶更改的用户名的权限。

这些都不适合我们。有谁知道如何从报告文件中删除晶体连接?

我们尝试了注销数据源位置和数据库专家中的所有设置。

UPDATE

我还没找到适合我的情况的解决方案。但是我们最新的解决方法是加载一份水晶报告,并且在点击闪电(针对数据库运行报告)之前,拔掉以太网电缆。然后,当Crystal无法找到数据库时,请将以太网电缆重新插入,并允许您选择不同的数据库服务器和名称。

+0

+1好问题,大多数人只是通过战斗,而不是花时间找出一个好的解决方案。 – Dusty 2009-09-01 21:47:53

回答

0

您可以在运行时设置登录。看到这个问题...

How do I change a Crystal Report's ODBC database connection at runtime?

如果您使用ODBC,每个开发可以在相应的数据库指向他们的DSN。实质上将连接字符串推入DSN并从晶体报告中移出。

+0

我们已经在运行时改变了连接。这不是问题。不幸的是,这个问题是设计师。 – Jon 2009-06-09 05:44:15

1

您可以在特定于用户的位置(即每个用户使用相同的路径,但使用不同的物理位置)中使用.dsn数据源文件,并指定Crystal Reports。例如,在每个人的C盘上:C:\ DSNs \ db.dsn,或者映射到每个用户的不同位置的网络驱动器上。

你可以在MSDN上.DSN文件的详细信息: http://msdn.microsoft.com/en-us/library/ms710900(VS.85).aspx

1

我们正在使用这种方式(使用SQL身份验证不过):

  • 开放报告
  • 数据库 - 登录服务器
  • 数据库集数据源位置
  • 刷新/预览

您可以禁用[域用户]访问开发数据库,​​将有助于太:)

+0

设置数据源位置也适用于集成身份验证。 – 2009-09-02 15:16:07

+0

我认为他们目前正在这样做,因为它看起来像所有的开发人员都有自己的副本。我认为问题在于,他们不希望每次有不同的开发人员针对他们自己的本地数据库处理报告时都必须这样做。 – Dusty 2009-09-02 15:23:30

0

是的,我同意Crystal Reports是一种痛苦。我在已经构建的应用程序中遇到了同样的问题,我不得不使用它。

1-注销服务器(晶体内右击数据库和注销) 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,你可以确保所有的开发数据库名称是相同的,那么使用 ”。”或“(本地)”作为服务器和集成安全性,以便每个人在本地有效地拥有相同的连接信息。我认为这可能是假设您可以让所有开发人员使用相同设置的最佳方式。

再次编辑:) 阅读了其他答案的一些评论后,我想我可能误解了这个问题。没有理由可以想到,为什么你无法在没有编辑报告的权限之外执行阿沃答案中的步骤,但我假设你已经能够做出其他更改,所以我怀疑是不是。我认为要让报告适用于您一直在执行这些步骤的每位开发人员。