Database ';OraOLEDB.Oracle';使用控制台应用程序时,提供程序未在本地计算机上注册?

Database ';OraOLEDB.Oracle';使用控制台应用程序时,提供程序未在本地计算机上注册?,database,vb.net,oracle10g,console-application,Database,Vb.net,Oracle10g,Console Application,我有一个我一直在开发的网站应用程序,VB.NET.NET3.5,一切正常。我还需要开发一个控制台应用程序来更新网站的数据库。我使用Oracle 10g数据库 我复制了我在主项目上使用的同一连接类,当我尝试调用连接方法时,出现以下错误: ConnectionString属性尚未初始化 如果我不使用该类并直接调用代码,则会出现此错误: “OraOLEDB.Oracle”提供程序未在本地计算机上注册 我不知道为什么,同样的连接现在在我的另一个项目上工作 我的连接类: Public Class conn

我有一个我一直在开发的网站应用程序,VB.NET.NET3.5,一切正常。我还需要开发一个控制台应用程序来更新网站的数据库。我使用Oracle 10g数据库

我复制了我在主项目上使用的同一连接类,当我尝试调用连接方法时,出现以下错误:

ConnectionString属性尚未初始化

如果我不使用该类并直接调用代码,则会出现此错误:

“OraOLEDB.Oracle”提供程序未在本地计算机上注册

我不知道为什么,同样的连接现在在我的另一个项目上工作

我的连接类:

Public Class connection
 Public con As New OleDbConnection
 Public Sub connect()
  con = New OleDbConnection
  con.ConnectionString = "Data Source=localhost;User Id=system;Password=root;Provider=OraOLEDB.Oracle"
 End Sub
End Class
当我称之为:

connection.con.Open()
 sql.Connection = connection.con
 sql.CommandText = ...
 sql.CommandType = CommandType.Text
 reader = sql.ExecuteReader()
 While (reader.Read())
  ...
 End While
connection.con.Close()

尝试为x86操作系统(32位)设置应用程序调试


构建->配置管理器->调试->配置:调试->平台x86

问题源于这样一个事实,即在64位机器上启动时为任何CPU编译的代码将由JIT生成为64位代码,因此无法使用32位驱动程序。只要重新编译x86平台的代码,它就可以在32位和64位系统上运行,并使用32位驱动程序

第二个问题是由于您没有调用connect(),因此您不能使用connection.con对象,更不用说调用open了

让我重写上面的一些代码

首先,该类应更改为

Public Class Connection
    Private con As OleDbConnection
    Public OleDbConnection GetConnection()
        con = New OleDbConnection
        con.ConnectionString = "Data Source=localhost;" + 
                                "User Id=system;Password=root;Provider=OraOLEDB.Oracle"
        return con
    End Function
End Class
现在代码可以用这种方式调用上面的类

Connection cc = new Connection()
Using con = cc.GetConnection()
    con.Open()
    sql.Connection = con
    sql.CommandText = ...
    sql.CommandType = CommandType.Text
    reader = sql.ExecuteReader()
    While (reader.Read())
        ...
    End While
End Using
正如您所看到的,当您调用GetConnection()时,该类返回一个正确初始化的连接,并且您可以在Using语句中使用该对象,该语句用于在不再需要该连接时释放该连接所使用的资源

当然,类连接本身是非常无用的,因为您可以直接在需要连接的代码上编写更简单的代码,而无需隐藏连接的创建。

但是,如果您计划添加更多功能….

在x64系统上运行为AnyCpu开发的应用程序,那么请尝试为x86编译。可能您安装的驱动程序是针对32位操作系统的,当您在带有任何CPU的x64系统中运行时,您的代码无法使用32位驱动程序。我尝试过这个方法,现在它说当我调用ExecuteReader方法时连接必须打开,但正如您在上面看到的,连接正在打开。在您上面的代码中,您不调用connect()因此你不应该使用这个连接。con对象,更不用说打开它了是的,你是对的,我错过了那部分。然而,当程序运行时出现了一个问题,它崩溃了,并且说vshost32.exe已经停止工作,你认为这可能与连接有关吗?因为这是我项目中唯一的东西。很难说。堆栈跟踪可能会有所帮助。并使用VS的调试器查找精确的行