.net 带有连接到Azure数据库的crystal reports的Windows客户端应用程序

.net 带有连接到Azure数据库的crystal reports的Windows客户端应用程序,.net,winforms,azure,crystal-reports,.net,Winforms,Azure,Crystal Reports,我正在开发一个现有的.Net winforms应用程序,该应用程序传统上在LAN SQL Server数据库上运行crystal reports。我正在尝试让它与Azure云数据库一起工作 现有的应用程序使用用户在登录时提供的服务器名称来连接并设置报表中每个表的位置等,这样报表就可以针对任何数据库服务器运行,而不仅仅是针对设计报表所针对的数据库运行。希望这对那些以前在windows应用程序中使用Crystal Reports的人来说是一个熟悉的概念,因为这是我为之工作的第二家公司,其代码类似于以

我正在开发一个现有的.Net winforms应用程序,该应用程序传统上在LAN SQL Server数据库上运行crystal reports。我正在尝试让它与Azure云数据库一起工作

现有的应用程序使用用户在登录时提供的服务器名称来连接并设置报表中每个表的位置等,这样报表就可以针对任何数据库服务器运行,而不仅仅是针对设计报表所针对的数据库运行。希望这对那些以前在windows应用程序中使用Crystal Reports的人来说是一个熟悉的概念,因为这是我为之工作的第二家公司,其代码类似于以下代码,在报告中的每个表和子报告中循环,以确保它们都指向指定的服务器:

For Each crTable In crTables
        CrtableLogoninfo = crTable.LogOnInfo
        CrtableLogoninfo.ConnectionInfo = App._CrConnectionInfo
        crTable.ApplyLogOnInfo(CrtableLogoninfo)
        crTable.Location = App.DBName & ".dbo." & crTable.Location.Substring(crTable.Location.LastIndexOf(".") + 1)
    Next
    crSections = CrReportDocument.ReportDefinition.Sections
    For Each crSection In crSections
        crReportObjects = crSection.ReportObjects
        For Each crReportObject In crReportObjects
            If crReportObject.Kind = ReportObjectKind.SubreportObject Then
                crSubreportObject = CType(crReportObject, SubreportObject)
                subRepDoc = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName)
                crTables = subRepDoc.Database.Tables
                For Each crTable In crTables
                    CrtableLogoninfo = crTable.LogOnInfo
                    CrtableLogoninfo.ConnectionInfo = App._CrConnectionInfo
                    crTable.ApplyLogOnInfo(CrtableLogoninfo)
                    crTable.Location = App.DBName & ".dbo." & crTable.Location.Substring(crTable.Location.LastIndexOf(".") + 1)
                Next
            End If
        Next
    Next
多年来,它一直针对各种局域网数据库工作,但似乎不适用于Azure。Crystal在运行时决定需要向用户提示代码设置的参数,这似乎表明连接出了问题。如果输入参数值,则某些字段不存在

我已经处理了对_CrConnectionInfo.LogonProperties.setConnectionString的各种调用,这些调用是紧接着上面代码之前的一些ConnectionString,但充其量它会进行到一个表示操作尚未实现的点

我尝试从Crystal Reports直接连接到云,并使用SQL Server Client 11连接类型实现了这一点。在应用程序中,当我通过调用_CrConnectionInfo.LogonProperties.SetConnection String创建SQL客户端连接时,Provider=SQLNCLI;服务器=tcp:theAzureDBInstanceName;密码=密码;持久安全信息=True;用户ID=登录名;初始目录=数据库名称;加密=是;或者类似的变化,它仍然不起作用


有人知道如何让Crystal直接从.Net应用程序连接到Azure数据库吗?如果您有代码建议,VB.Net或C示例都可以。

这可能是由于USE语句。您能否更改代码并确保:

连接字符串直接引用数据库:。。。;初始目录=myDataBase;。。。 在代码中,替换App.DBName&.dbo.&。。。使用.dbo和。。。尝试删除对数据库的任何直接引用
Crystal报告说,即使是最新的CR 2013 SP4也不支持Azure SQL

资料来源:

如果您在本地MSSQL数据库上设计报表,则可以在运行时在Azure SQL数据库上成功运行报表,前提是您适当地设置了表位置,正如我在上面链接的线程中所提到的——但是如果您使用的是存储过程,则需要注意——您必须关闭报告选项“第一次刷新时验证存储过程”

如果您想要对Azure SQL的支持,那么我敦促您投票支持以下想法:{91C7DF6B-4BDA-4DB4-90DB-9695ADCCF09B}

对于SAP为什么没有解决这一问题,我仍然目瞪口呆


注意:我发现另一个尚未在Crystal Reports中实现的常见操作原因是报告使用的字体在客户端不可用,但在报告中使用。如果有一条无效的字体信息就好了:

谢谢,但我不明白你说的USE语句是什么意思。我们的代码中没有use语句。尽管如此,我还是尝试了,但没有成功。如果我针对完全限定的表名(即DBName.dbo.TableName)直接将查询写入Azure数据库查询网站,它会工作,因此我认为这与问题无关。尝试更改将位置设置为crTable.location=crTable.location.SubstringcrTable.location.LastIndexOf的行。location=crTable=crTable.location.SubstringcrTable.location+1,因此它只是表名,并且带有dbo。前缀仍然有效,但都无效。删除设置位置的行crTable.location=App.DBName&.dbo.&crTable.Location.SubstringcrTable.Location.LastIndexOf.+1,而是通过CrReportDocument.DataSourceConnections.Clear CrReportDocument.DataSourceConnections0.setconnectionCp:ServerName.database.windows.net,DBName,True将直接在上述代码之前设置数据源,从而显示登录提示。当我输入正确的登录详细信息时,它会显示操作未实现。参数提示似乎是针对子报表,因此问题可能是子报表连接和主报表的连接没有问题。我创建了一个针对cloud Azure数据库设计的新crystal报表。我更改了程序以打开此报告,而不执行我粘贴的任何代码,即保持连接在设计时的状态。运行时,它会提示输入登录信息。当我提供它时,它说操作尚未实施。在谷歌上搜索这个错误只是谈论人们所遇到的字体问题,这在这里是不适用的。