【问题标题】:Creating Crystal Report with Dynamic Database使用动态数据库创建 Crystal Report
【发布时间】:2018-06-15 07:01:39
【问题描述】:


我使用水晶报表创建了一个报表。
目前,我使用 User DSN 作为其数据源。
但主要问题是报告仅在我设置 trustedconnection = TRUE 时从主 PC 打开。
我可以将 LAN pc 中的 DSN 更改为 Trusted Connection 为 FALSE,并通过 ODBC 手动设置 UserId 和 Pwd。
通过这样做,报告可以在 LAN 中完美运行,但我的另一个问题是我必须 在程序运行时更改数据库。
所有数据库结构(模式)、表、过程、视图都是相同的,只是名称不同。
现在,当我以编程方式从 DSN 更改默认数据库时,一切正常。
但这仅适用于主 PC,因为我可以在受信任的 Connection = TRUE 时更改 DSN.. 并且 我无法以编程方式输入 DSN 的密码(已搜索)。

我尝试了以下更改数据库的代码,CrystalReportViewer1 成功打开报表,没有任何错误。

Dim myDBConnectionInfo As New ConnectionInfo()
        With myDBConnectionInfo
            .ServerName = My.Settings.SysSvName
            .DatabaseName = Pubdbname
            .UserID = “sa”
            .Password = “sa123”
        End With

        orptname.Load("JVR.rpt")
        orptname.SetParameterValue("@CompYear", PubYear1)
        orptname.SetParameterValue("@CompNo", mComp1)
        orptname.SetParameterValue("@fdatee", Format(CDate(FromDate.Text), "MM/dd/yyyy"))
        orptname.SetParameterValue("@tdatee", Format(CDate(ToDate.Text), "MM/dd/yyyy"))
        orptname.SetParameterValue("cfdate", Format(CDate(FromDate.Text), "MM/dd/yyyy"))
        orptname.SetParameterValue("ctdate", Format(CDate(ToDate.Text), "MM/dd/yyyy"))
        orptname.SetParameterValue("CName", PubCName)
        orptname.SummaryInfo.ReportTitle = "JVR REPORT" & "_" & Format(CDate(FromDate.Text), "ddMMyyyy") & "-" & Format(CDate(ToDate.Text), "ddMMyyyy")
        CReports.CRViewer.ReportSource = orptname

        CReports.Show() '----- CrystalreportViewer1

但是没有数据被检索。
在此之后,我将数据库名称更改为我创建(使用数据库设计)报告的 Test1,它成功显示了数据。
再次尝试将 db 更改为 Test2 显示没有结果(但 Crystal Report 打开时没有任何错误连接错误。)

更改 DSN 默认数据库成功显示记录。
目前,我正在使用的成功运行代码如下。

 With orptname
            .DataSourceConnections.Item(0).SetConnection("DSNNAME", Pubdbname, True)
            .SetParameterValue("ctdate", Format(CDate(ToDate.Text), "MM/dd/yyyy"))
            .SetParameterValue("CName", PubCName)
            .SummaryInfo.ReportTitle = "TEST REPORT" & "_" & Format(CDate(FromDate.Text), "ddMMyyyy") & "-" & Format(CDate(ToDate.Text), "ddMMyyyy")
            CReports.CRViewer.ReportSource = orptname
            CReports.Show()
        End With

那我现在该怎么办?
简而言之,我希望我的 Crystal Report 也可以在 LAN PC 中打开,并且我可以动态设置数据库。 (所有数据库都有完全相同的架构)

【问题讨论】:

  • 任何其他获得结果的方式也相当可观。

标签: vb.net crystal-reports


【解决方案1】:

这可能对您不起作用(因为此过程不使用 DSN),但它可能会让您知道该怎么做。这是针对 CR 2010 的。

        crxRpt.Load("report.rpt")
        Dim myTables As CrystalDecisions.CrystalReports.Engine.Tables = crxRpt.Database.Tables
        'Login for 1st DB in the report. 
        crxRpt.SetDatabaseLogon(dbUser1, dbPwd1, dbServer1, dbDB1) 
        'Login for 2nd DB in the report. IGNORE IF YOU ONLY HAVE 1 DB
        crxRpt.SetDatabaseLogon(dbUser2, dbPwd2, dbServer2, dbDB2)
        Dim crConnInfo1 As CrystalDecisions.Shared.ConnectionInfo = New CrystalDecisions.Shared.ConnectionInfo
        'Again, ignore if you only use 1 DB
        Dim crConnInfo2 As CrystalDecisions.Shared.ConnectionInfo = New CrystalDecisions.Shared.ConnectionInfo

        crConnInfo1.DatabaseName = dbDB1
        crConnInfo1.UserID = dbUser1
        crConnInfo1.Password = dbPwd1
        crConnInfo1.ServerName = dbServer1
        'again, ignore if you only use 1 DB
        crConnInfo2.DatabaseName = dbDB2
        crConnInfo2.UserID = dbUser2
        crConnInfo2.Password = dbPwd2
        crConnInfo2.ServerName = dbServer2
        For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
            Dim myTableLogonInfo As CrystalDecisions.Shared.TableLogOnInfo = myTable.LogOnInfo
            If myTable.LogOnInfo.ConnectionInfo.DatabaseName = dbDB1 Then
                myTableLogonInfo.ConnectionInfo = crConnInfo1
                myTable.ApplyLogOnInfo(myTableLogonInfo)
            ElseIf myTable.LogOnInfo.ConnectionInfo.DatabaseName = dbDB2 Then
                myTableLogonInfo.ConnectionInfo = crConnInfo2
                myTable.ApplyLogOnInfo(myTableLogonInfo)
            End If
        Next

然后加载参数(如果有),然后加载选择公式(如果有),最后将报表对象放入查看器(如果需要)。

如果您有子报表,也必须对子报表执行此操作。基本上,当您从设计时更改连接信息时,您必须通知报表及其子报表中的每个表。

希望这会有所帮助。

【讨论】:

  • 好的,但是当我使用 DSN 创建报告时它会起作用吗?我的意思是我使用数据源作为 DSN ......我仍然在尝试告诉你会发生什么。@KalaNag
  • 这会提示一个数据库登录窗口。此外,数据库仍然是窗口中的前一个数据库。前任。我在代码中编写了 test2,并且报告将报告的位置设置为 test1。所以它在登录提示符中捕获了test1......实际上,登录提示符也不应该显示。
  • 我更改了与 oledb 的连接并使用了 sql server 本机客户端。你不会相信,但它就像我想要的那样轻松地工作......没有通知报告中的每个表格,什么都没有......只需更改这行代码中的设置,它就像黄油一样工作。 report.DataSourceConnections.Item(0).SetConnection("servername", "dbname", "sa", "pass")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多