【问题标题】:Debugging crashes vshost.exe on oledbconnection.open, works fine without vshost调试 oledbconnection.open 上的 vshost.exe 崩溃,没有 vshost 也能正常工作
【发布时间】:2011-11-08 17:34:37
【问题描述】:

我正在运行一个简单的测试应用程序,它打开一个 OLEDB 连接,检索单个值,然后关闭。编译后的(控制台)应用运行良好,但从 IDE 运行它会导致静默关闭(如果是 winforms 应用)或 vshost32.exe 崩溃(如果是控制台应用)。

devenv 在 Windows x64 上是 VB 2010 Express,但我将解决方案上的配置管理器设置为“调试”-“x86”。

Imports System.Data.OleDb

Module Module1

    Sub Main()
        Dim server As String = "xxxxx"
        Dim username As String = "xxxxx"
        Dim password As String = "xxxxx"
        Dim schema As String = "xxxxx"

        Dim connectionString As String = String.Format( _
            "Provider=SLXOLEDB.1;Data Source={0};Initial Catalog={3};User ID={1};Password={2};Extended Properties=LOG=ON;Connect Timeout=5;", _
            server, username, password, schema)

        Dim con As OleDbConnection = New OleDbConnection(connectionString)
        con.Open()

        Dim query As String = "SELECT USERID FROM USERSECURITY WHERE USERCODE=?"
        Dim cmd As New OleDbCommand(query, con)
        cmd.Parameters.AddWithValue("usercode", username)
        Dim userid As String = cmd.ExecuteScalar.ToString

        Console.WriteLine("UserID is {0}", userid)

        cmd.Parameters.Clear()

        con.Close()
        con = Nothing

    End Sub

End Module

【问题讨论】:

  • 您为什么使用? 而不是@UsercodeAddWithValue("@usercode, username) 结合使用?还。您应该声明并使用带有using 的连接,以免占用sql server 上的资源。
  • 不是因为您的崩溃,而是因为您粘贴的代码。这就是为什么我把它作为评论而不是答案。如果您使用调试器运行它并单步执行每一行会发生什么。
  • 我使用 con.Open() 进入该行,当我执行该语句时,它会挂起几秒钟,然后导致 vshost 崩溃。关于?,说实话我不记得了。我认为这与我使用的 OLEDB 提供商不喜欢它们有关,但我可能会忘记:D 一旦我让它再次工作,我会测试它!我不能完全使用“它是遗留代码”的借口,因为它是我所有的代码,但如果它已经很老了,而且是在我比现在更无知的时候编写的。
  • 如果问题出在 Open 它必须是连接字符串或提供程序。当提供程序 (SLXOLEDB.1) 上存在非托管异常时,我已经看到 vshost 崩溃
  • 该死的。我将测试更改为使用标准 SQL 提供程序(我需要 SalesLogix 提供程序)并且它可以工作。所以我想这是一个 SLXOLEDB 提供商问题,这意味着我可能很难找到解决方案。虽然它在我以前的 x64 PC 上运行,所以也许我可以处理一些 DLL...

标签: vb.net visual-studio-2010


【解决方案1】:

您可以尝试禁用 vshost 看看会发生什么。

我也会看看输出窗口,也许你那里有一些有价值的信息。

【讨论】:

  • 如果我禁用 vshost,则错误变为“oledbtest.exe 停止响应” - 但输出窗口中仍然没有任何内容。如果我从这两个选项中选择“调试”,我就会返回到 IDE。在任何情况下,IDE 中都不会引发任何异常。
【解决方案2】:

解决方案很简单。

SalesLogix OLEDB 提供程序工作正常,但您只能在使用管理员权限启动 IDE 时进行调试。

使用 procmon 进行一些挖掘可能会知道正在访问哪些键/文件,但在我们的例子中,我可以使用提升的 IDE 进行调试。

【讨论】:

  • 在堆栈溢出时将自己的答案标记为正确是政治正确的。
  • 是的,我只是想给它一天时间,以防有人想出一些有见地的东西:)
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多