Vb.net 用动态数据库创建Crystal报表
Vb.net 用动态数据库创建Crystal报表,vb.net,crystal-reports,Vb.net,Crystal Reports,我已使用crystal reports创建了一个报告。 目前,我正在使用用户DSN作为其数据源。 但主要的问题是,当我设置trustedconnection=TRUE 我可以将局域网pc上的DSN更改为“可信连接”为“假”,并通过ODBC手动设置用户ID和Pwd。 通过这样做,报告在LAN中可以完美地工作,但我的另一个问题是我必须 在程序运行时更改数据库。 所有数据库结构(架构)、表、过程、视图都相同,只是名称不同。 现在,当我以编程方式从DSN更改默认数据库时,一切正常。 但这只适用于主PC
我已使用crystal reports创建了一个报告。
目前,我正在使用用户DSN作为其数据源。
但主要的问题是,当我设置
trustedconnection=TRUE
我可以将局域网pc上的DSN更改为“可信连接”为“假”,并通过ODBC手动设置用户ID和Pwd。
通过这样做,报告在LAN中可以完美地工作,但我的另一个问题是我必须 在程序运行时更改数据库。
所有数据库结构(架构)、表、过程、视图都相同,只是名称不同。
现在,当我以编程方式从DSN更改默认数据库时,一切正常。
但这只适用于主PC,因为当trusted 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
那我现在该怎么办?简言之,我希望我的水晶报告打开局域网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
然后加载参数(如果有),然后加载选择公式(如果有),最后将报表对象放入查看器(如果需要)
如果您有子报表,也必须对子报表执行此操作。基本上,当您从设计时更改连接信息时,您必须通知报表及其子报表中的每个表
希望这能有所帮助。还有其他方法可以获得同样可观的结果吗?好的,但是当我使用DSN创建报告时,它会起作用吗??我的意思是我使用数据源作为DSN。。。“我仍然在尝试并告诉您发生了什么。”Kalanagt提示一个数据库登录窗口。此外,数据库仍保持窗口中的前一个数据库。我在代码中编写了test2,而报告将报告的位置设置为test1。所以它在登录提示中捕获test1。。。实际上,登录提示也不应该显示。我将连接更改为oledb并使用sql server本机客户端。你不会相信的,但它很容易就达到了我想要的效果。。没有通知报告中的每个表,没有。。。只要更改这行代码中的设置,它就会像黄油一样工作<代码>报表。数据源连接。项(0)。设置连接(“服务器名”、“数据库名”、“sa”、“通过”)