我使用QTP/UFT进行应用程序测试。
我需要访问我的Oracle DB (11g) 来执行一些DB设置(以更新记录)。
我使用
我有以下dlls(其中存在问题的是myDBWrapper):
我的连接字符串:
我使用
oracle.manageddataaccess.dll
(引用到我的myDBWrapper类库项目)。我有以下dlls(其中存在问题的是myDBWrapper):
![enter image description here](https://istack.dev59.com/0oGTI.webp)
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()
driver.vbs
文件,它使用 QTP 的 AOM - 它应该在启动时隐藏 QTP。一旦调用了 QTP,它就开始执行所有操作。全局对象使用 dotnetfactory 和 QTP 的 dll 初始化一次 QTP 调用后。如果我要再次取消隐藏,我需要在 QTP 中使用单独的函数来完成此操作,因为 driver.vbs 是一个单独的进程,无法处理这个问题。目前由于这个问题,我不使用隐藏模式。但我想使用隐藏模式来提高整体性能。感谢您的查看。 - KitKarson