Microsoft.VisualBasic.dll中发生了'System.InvalidCastException'类型的第一次机会异常

时间:2012-11-08 18:50:58

标签: asp.net vb.net exception casting

我正在努力将针对Dynamics CRM SDK 2011的Microsoft示例中的某些控制台代码转换为ASP.NET Web应用程序。它在控制台模式下运行良好,但在转换为在ASP.NET中运行后,我收到错误:

  

Microsoft.VisualBasic.dll中出现'System.InvalidCastException'类型的第一次机会异常

这是我的源代码:

    Public Sub Run(ByVal connectionString As String, ByVal promptforDelete As Boolean)
    Try
        Dim connection As Microsoft.Xrm.Client.CrmConnection =
            CrmConnection.Parse(connectionString)
        _orgService = New OrganizationService(connection)
        Using _orgService
            Dim account_Renamed As Account = New Account With {.Name = "Fourth Coffee"}
            _accountId = _orgService.Create(account_Renamed)
            Response.Write(CType("{0} {1}", Char()), account_Renamed.LogicalName, account_Renamed.Name)
            Dim cols As New ColumnSet(New String() {"name",
                                                   "address1_postalcode",
                                                    "lastusedincampaign"})
            Dim retrievedAccount As Account = _orgService.Retrieve("account", _accountId, cols).ToEntity(Of Account)()
            Response.Write("Retrieved record.")
            retrievedAccount.Address1_PostalCode = "98052"
            Response.Write("Updated Account Postal Code.")

        End Using
    Catch ex As Exception

    End Try
End Sub

2 个答案:

答案 0 :(得分:0)

所以,我明白了。在基于Web的应用程序中,无需使用{0} {1}:

Response.Write(CType("{0} {1}", Char()), account_Renamed.LogicalName, account_Renamed.Name)

相反它看起来像这样:

Response.Write(account_Renamed.LogicalName & " " & account_Renamed.Name)

答案 1 :(得分:0)

失败的原因与您的应用程序是基于Web的无关。这与您使用CType()的方式有关。您正在使用它来连接两个不是它所用的字符串。

CType()方法用于将对象强制转换为特定类型。有了这段代码:

CType("{0} {1}", Char())

您告诉CType()将字符串文字"{0} {1}"转换为字符数组。这实际上有效!现在,您将一个字符数组传递给Reponse.Write()以及另外两个参数,这些参数对我来说似乎是字符串值。

Reponse.Write()的重载接受三个参数,第一个是字符数组,但其他值是整数(索引和计数)。

老实说,我很惊讶这甚至建立了,更不用说跑了。对于将来的代码,最好完成字符串连接(恕我直言),如下所示:

String.Format("{0} {1}", account_Renamed.LogicalName, account_Renamed.Name)

而不是与&运算符连接。如果以这种方式连接字符串,您的代码将更改为此。

Response.Write(String.Format("{0} {1}", account_Renamed.LogicalName, account_Renamed.Name))

使用String.Format()实际上是使用StringBuilder类的快捷方式,它在字符串处理方面非常有效。当您使用连接运算符&时,每次将一个片段附加到字符串时,都会在内存中创建一个全新的字符串对象。 StringBuilder以可变的方式创建/变换字符串,并且在执行大量字符串工作时速度更快。这就是为什么我认为这是使用快捷方法的最佳做法。