Oracle连接打开错误

8
我使用QTP/UFT进行应用程序测试。 我需要访问我的Oracle DB (11g) 来执行一些DB设置(以更新记录)。
我使用oracle.manageddataaccess.dll(引用到我的myDBWrapper类库项目)。
我有以下dlls(其中存在问题的是myDBWrapper): enter image description here 我的连接字符串:
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<HOST>)(PORT=<PORT>>)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<SERVICENAME>)));User Id=<USERNAME>;Password=<PASSWORD>;
问题:

conn.open()期间,下面的代码会抛出错误。有时它可以工作,有时它会在同一台机器上抛出一个错误,指出“对象引用未设置为对象的实例”。

conn = New OracleConnection()
conn.ConnectionString = ConnectionString
MsgBox("isnothing? : " & (conn Is Nothing).ToString)   'it is always False. So , not null

conn.Open()  ' It throws an error that "Object reference not to set an instance of an object"

Dim cmd As OracleCommand = New OracleCommand(strQuery)
cmd.BindByName = True
cmd.Connection = conn
RowsAffected = cmd.ExecuteNonQuery()
cmd.Dispose()
conn.Dispose()

注意:

这不是资源泄漏。我只建立了一个连接并进行了处理。没有其他人连接到数据库。

问题发生在 - 当 QTP 有 COM 库时。当我使用它来自动化并使其不可见 (QTP.Visible = FALSE) 时发生问题。如果我使用 QTP.Visible = TRUE - 问题就不会发生。这是什么问题!!!

StackTrace:

Object reference not set to an instance of an object.
   at OracleInternal.I18N.Conv.GetMaxBytesPerChar(Int32 charsetId)
   at OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(ConnectionString cs, Boolean bOpenEndUserSession)
   at OracleInternal.ConnectionPool.PoolManager`3.CreateNewPR(Int32 reqCount, Boolean bForPoolPopulation, ConnectionString csWithDiffOrNewPwd)
   at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd)
   at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword)
   at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword)
   at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
   at myDBWrapper.Utility.DBUtil.OpenConnection()

@TheBlastOne,感谢您的检查。是的,我在我的问题中也提到了同样的内容 - 在堆栈跟踪中。 - KitKarson
1
似乎是OracleInternal.I18N中的一个错误……我不知道你能否解决它。 - Zohar Peled
1
可能的解决方法:开始时隐藏,仅在连接时取消隐藏,然后重新隐藏。此外,您可以配置QTP为最小化状态,并仍然具有“可见”状态。 - TheBlastOne
@TheBlastOne,问题是 - 我有一个 driver.vbs 文件,它使用 QTP 的 AOM - 它应该在启动时隐藏 QTP。一旦调用了 QTP,它就开始执行所有操作。全局对象使用 dotnetfactory 和 QTP 的 dll 初始化一次 QTP 调用后。如果我要再次取消隐藏,我需要在 QTP 中使用单独的函数来完成此操作,因为 driver.vbs 是一个单独的进程,无法处理这个问题。目前由于这个问题,我不使用隐藏模式。但我想使用隐藏模式来提高整体性能。感谢您的查看。 - KitKarson
@TheBlastOne,是可以做到的。 - KitKarson
显示剩余5条评论
3个回答

1
因为看起来像VB.NET,你是否在窗体加载中获取了该代码?如果没有显示窗体,该事件是不可预测的。

-1

试试这个

conn = New Oracle.ManagedDataAccess.Client.OracleConnection(ConnectionString)

-1

你尝试过使用ADOB连接对象连接Oracle数据库吗?你需要安装Oracle驱动程序,它将帮助你通过创建ADOB连接对象来连接到数据库。


1
这可能更适合作为注释而不是答案。 - Bowdzone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接