vb.net - 使用动态数据库创建水晶报表
问题描述
我使用水晶报表创建了一个报表。
目前,我使用用户 DSN作为其数据源。
但主要问题是报告只能从我设置的主 PC 中打开trustedconnection = TRUE
。
我可以将 LAN pc 中的 DSN 从可信连接更改为 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 中打开,并且我可以动态设置数据库。(所有数据库都有完全相同的架构)
解决方案
这可能对您不起作用(因为此过程不使用 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
然后加载参数(如果有),然后加载选择公式(如果有),最后将报表对象放入查看器(如果需要)。
如果您有子报表,也必须对子报表执行此操作。基本上,当您从设计时更改连接信息时,您必须通知报表及其子报表中的每个表。
希望这可以帮助。
推荐阅读
- javascript - 使用 AJAX POST/GET 方法解析 Base64 字符串时的未定义索引
- jquery - 有条件的切换类
- c# - 如果我不能在 C# 中调用析构函数,为了安全起见销毁对象的解决方案是什么?
- java - 滚动窗格中的 TextField 未正确显示
- macos - 如何使用 IOHIDManager 或蓝牙读取 iOS 键盘上的 home 键?
- php - incIude.php,在“l”位置用大写“i”拼写
- python - 纸浆和 OR-Tools 替代品
- search - 在 wooocmmerece 网站上应用无限滚动未按预期工作
- angular - 有 Promise 的 Jasmine 测试构造函数
- architecture - 架构:微服务、多重需求和共享数据