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