Oracle8i Enterprise Edition Release Notes
A68803-01

Library


Prev

Oracle Objects for OLE (OO4O) Release Notes

 

Release 8.1.5.3.3

March 1999

This software/documentation contains proprietary information of Oracle Corporation; it is provided under a license agreement containing restrictions on use and disclosure and is also protected by copyright law. Reverse engineering of the software is prohibited.

If this software/documentation is delivered to a U.S. Government Agency of the Department of Defense, then it is delivered with Restricted Rights and the following legend is applicable:

RESTRICTED RIGHTS LEGEND:

Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph (c)(1)(ii) of DFARS 252.227-7013, Rights in Technical Data and Computer Software (October 1988).

If this software/documentation is delivered to a U.S. Government Agency not within the Department of Defense, then it is delivered with "Restricted Rights," as defined in FAR 52.227-14, Rights in Data - General, including Alternate III (June 1987).

Oracle Corporation, 500 Oracle Parkway, Redwood City, CA 94065.

The information in this document is subject to change without notice. If you find any problems in the documentation, please report them to us in writing. Oracle Corporation does not warrant that this document is error free.

Oracle, CASE*Dictionary, Pro*COBOL, SQL*Connect, SQL*Forms, SQL*Loader,  SQL*Net, and SQL*Plus are registered trademarks of Oracle Corporation. CASE*Designer, CASE*Method, Net8, Oracle7, Oracle8, Oracle8i, Oracle Call Interface, Oracle Parallel Server, Oracle Recovery Manager, PL/SQL, Pro*C/C++, SQL*Module, Oracle Server Manager and Trusted Oracle are trademarks of Oracle Corporation.

All trade names referenced are the service mark, trademark, or registered trademark of the respective manufacturer.


This file contains important information specific to Oracle Objects for OLE release 8.1.5.3.3. The following topics are covered:

Oracle Objects for OLE 8.1.5.3.3

Install Note: Oracle Objects for OLE is not a MULTIPLE ORACLE HOME product. It should be installed only once, on any home. Installing OO4O into a second home will render the previous version obsolete.

System Requirements

  1. Intel-based PC running Windows NT 4.0, Windows 95, or Windows 98.
  2. Minimum 486-50Mhz processor (Pentium recommended).
  3. 8 Mb memory (16 Mb recommended).
  4. 10 Mb free disk storage for the OO4O program files.
  5. Enough additional disk storage to create a local cache the size of your largest dynaset. Oracle recommends approximately 10 Mb of free disk space in your swap partition.
  6. 32-bit application capable of OLE scripting (Visual Basic 4/5/6, Excel 5/7, etc.) or supported C++ compiler (Microsoft Visual C++ 2.x/4.x/5.x/ 6.x).
  7. Access to an Oracle 7.3 or an Oracle8i database, through a local connection or a network using the Net8 Client.

General Information and Dependencies

This release is a 32-bit version of Oracle Objects for OLE and will work on Windows NT, Windows 95 and Windows 98.

Class libraries are provided for Microsoft Visual C++ versions 2.x, 4.x, 5.x, and  6.x. Refer to the "Oracle Class Libraries" section in this document for information on the C++ class libraries provided in this release.

What is included in this release:

New Features

This release represents a very large amount of functionality added since version 2.3. For more information on these new features and objects, see the online help and example files. Care has been taken so that existing features of the previous version are supported.

Enhancements introduced in version 2.3 were connection pooling, thread safety (supporting "Both" COM Threading Models), and performance enhancements. Full documentation of these new features is provided in the online help.

Please note that to use oo4o in a free threaded environment in Windows 95 the following string value would be added to the InProcServer32 key: ThreadingModel = "Both". This is added by default in the NT environment.
 

New Sample Files

New samples have been added to demonstrate thread safety features and using it within the Internet Information Server environment. The C++ sample can be found at \ORACLE_HOME\OO4O\CPP\WORKBOOK\MULTHRD and the IIS samples can be found in the \ORACLE_HOME\OO4O\IIS\ directory.

Following are the new samples in \ORACLE_HOME\OO4O\VB\SAMPLES directory:

Please refer to the readme.htm file in the \ORACLE_HOME\OO4O\VB directory.
 

Long/Long Raw Migration to BLOB, CLOB or BFILE Recommended

Oracle8i introduces the following new types -- BLOB, CLOB, and BFILE. The design of these types allow Oracle Objects for OLE to access them much faster than Long or Long Raw. For this reason you are urged to convert pre-existing Long Raw based applications to BLOB, CLOB and BFILE. New applications should use BLOB, CLOB and BFILEs rather than Long Raw.

Such migration should be relatively simple with little code changes required. This is because the methods previously used for Long and Long Raw manipulation have been enhanced to allow them to be used against BLOB, CLOB, and BFILE as well. These methods are AppendChunk, AppendChunkByte,  GetChunk, GetChunkByte, GetChunkByteEx, and ReadChunk. The primary code changes will involve the requirement that NULL BLOB and CLOB be updated with "Empty" before being used. Note: For maximum flexibility, new applications should use the normal BLOB/CLOB/BFILE Read and Write methods instead of these Chunk methods.

Migrating to BLOB gives the added benefit of Data Control writes. Refer to the "Oracle Data Control" section in this document.
 

Getting Started

Please read the "Getting Started With the OO4O Automation Server" section provided in the online help and try out the sample programs installed with the product. Also, many methods in the online help include links to example code that you can cut and paste into your VB application and step through.

From Visual Basic 6, you can load the oo4o Type Library by going to the menu and choosing Project-->References. The name of the library is OIP8.TLB. After doing this you can browse the oo4o objects by going to the menu and choosing View-->Object Browser. The Data Control can be added by going to the menu and choosing Project-->Components. The name of the data control is ORADC.OCX.

ASP users can try out the sample located in the ORACLE_HOME\oo4o\Iis\Samples\ASP\ConnPool directory.
 

Building the C++ Sample Applications

Since Microsoft Visual C++ 2.x/4.x stores path information in the MSVC.INI file, we cannot supply the path information for local environment. In those cases you will probably need to modify the project to include the required paths. You should also read the compiler specific documentation 'Bound Controls for MFC ' for the compiler you are using.

Installation Layout

As part of a Typical Installation the following directories will be created and will contain the corresponding files:

Redistributable Files

If you cannot guarantee that your end user will have this version of Oracle Objects for OLE installed on their machine, you will need to redistribute certain files along with your application.

Please see the online help (Redistributable Files) for more information about which files are involved.

When not installed by the Oracle installer, the Oracle Data Control (ORADC.OCX) will have to be registered for it to function. The OCX may be registered by running regsvr32.exe oradc.ocx from a DOS prompt.

Known Issues

Oracle In-Process Server

ORA-12704 with  NCHAR or NVARCHAR2  Data Types

NCHAR and NVARCHAR2 datatypes are not supported in this release. The error "character set mismatch" is likely if operations are attempted on these types.

Type Library changes

An incompatibility with the type library was introduced in  OO4O versions 2.3.x (up to and including 2.3.2) and  OO4O 8.1.3.3.0. This has been corrected in the current release. Applications using early binding with OO4O versions 2.3.x (up to and including 2.3.2 and 8.1.3.3) need to be re-compiled.

LOB columns with Dynaset with ORADYN_ORAMODE

Adding  LOB columns in a dynaset created with ORADYN_ORAMODE option does not work with this release.

Lob, Objects, REF, Collections Dirty Writes

With all other column types, when you attempt to do an update, and the value of the field has been changed by another user, you receive an OIP-4119 "Data Has been Changed" error. This error will not occur with BLOB and CLOB, Object ,REF and collection types and the data will be updated regardless.

Error with Visual Basic 6 -- Runtime Error '5': Invalid Procedure Call or Argument

Microsoft has changed the way that operators (<, >, =, &) evaluate objects in VB 6.0.

The following code will generate an error with Visual Basic 6.0 but will work with Visual Basic 5.0:

MsgBox "Ename:" & OraDynaset.Fields!ENAME
MsgBox "Ename:" & OraDynaset.Fields("ENAME")
If OraDynaset.Fields!EMPNO = 7222 Then Msgbox "Hello World"
If OraDynaset.Fields("EMPNO") = 7222 Then Msgbox "Hello World"

The workaround is to explicitly use the .Value property, and to avoid using the "!" (default property) operator.

This change in design seems to affect only the operators (<, >, =, &) when used in clauses. The Msgbox method, and operators not used in clauses are still able to figure out the correct value.

For example, the following still works in both VB5 and VB6:

MsgBox OraDynaset.Fields!ENAME
MsgBox OraDynaset.Fields("ENAME")
int_var  = OraDynaset.Fields("EMPNO")
Msgbox "Empno:" & int_var

For more information on this design change please see the MS knowledge base article:
Q194368: Operators Do Not Recursively Call Object Default Properties
This is available at http://support.microsoft.com/support/

ORADB_NOWAIT Option of OpenDatabase

The effect of this option differs significantly from it's behavior in version 2.3. It now only applies to OraDynaset. It no longer has any effect on OraSqlStmt objects or ExecuteSQL calls. Also, it now only gives an error in the case of a locked row (in 2.3 it gave an error when there was *any* database resource contention no matter how brief, which was generally disruptive)

ChunkSize for for LONG LONG RAW columns

The ChunkSize can be less than or equal to 65280 bytes and not 64K as mentioned in the online documentation. This is true for all the chunking methods GetChunk, GetChunkByte, GetChunkByte , GetChunkByteEx and ReadChunk.

Behavior of MoveTo, MoveRel, Movexxxxn

MoveTo:

The behavior of this method is correct but the documentation does not make clear how this method behaves: Row numbers are static between refreshes. They are very much like a row id. Row numbers are not dynamically reassigned after deletions. Therefore if you do a MoveFirst followed by a MoveTo 4, you will end up at the same row, whether or not rows 2 and 3 have been deleted. So, you should not do arithmetic based on values of row numbers unless you can guarantee no row has been deleted (such as immediately after a refresh). That is, you can not be sure how far apart row 1 and row 4 are in terms of valid (non-deleted) rows. The row number simply serves as a label or id and it's actual value is meaningless in terms of relative position whenever rows have been deleted.

MoveRel, Movexxxxn

These methods do not work correctly when rows have been deleted. They incorrectly add the offset you provide to the value of the row number and move there (or to the next available valid row in the case the resulting row has been deleted). Unless you can guarantee that no row has been deleted (such as immediately after a refresh) these methods should probably not be used. Instead, use a loop of MoveNext or MovePrev to achieve the same results.

Find Methods


ORAPARM_INPUT, OUTPUT and BOTH IOTYPE with ADD and ADDTABLE Methods

Care should be taken to be sure that this value is correct. For example, with a stored procedure, ORAPARM_INPUT should be used only with IN parameters, ORAPARM_OUT with OUT and ORAPARM_BOTH only with IN OUT. Setting an incorrect option, such as ORAPARAM_BOTH for a stored procedure parameter type IN can result in errors in certain circumstances. You should create a separate parameter if it's usage will be different. In other words ORAPARAM_BOTH means "for IN OUT parameters only". It does not mean that you should use the parameter against one stored procedure that has an IN parameter and then use it in another that has an OUT parameter. In that case you should make two parameters. The errors this can cause are rare, but if you find parameter related errors you should check this.
 

Oracle Data Control

New Functionality in Oracle Data Control

The Oracle Data Control now can be used against BLOB and BFILE columns. And when used against BLOB columns, it now allows the writing of data. One interesting way to take advantage of this is to bind the ORADC to the MS OLE Container Control and store the state of the OLE object in an Oracle BLOB column.

The MS OLE container always writes out the state of the object if a user activates it and then navigates to a new row. For backward compatibility, and because the developer may want to allow read only access, a BLOBReadOnly property has been added to the Data Control. When this property is set to true, any write requests from data aware controls to Oracle BLOB columns will be ignored and no error message will be generated.

It is not possible to write to BFILE or Long Raw columns using the Data Control. You might consider migrating your Long Raw columns over to BLOB columns for this reason as well as to gain the performance improvements that BLOBs offer (BLOBs and BFILEs and significantly faster than Long Raws with Oracle Objects for OLE).

It is not possible to read CLOB data using the Oracle Data Control.

Custom controls support

Oracle Data Control is a fully functional Visual Basic 5.0 Custom Control (OCX). It is compatible with any data-aware bound control (OCX) that uses the Microsoft VB data binding specifications.

The following data aware controls have been tested with the Oracle Data Control and here are some comments. Other controls not listed here will work with the Oracle Data Control as long as they follow the Microsoft VB data binding specifications.

Microsoft Visual Basic Standard Controls

Tested Versions: VB 4.0, 5.0 and 6.0

Edit control

Works fine with Oracle data control.

Static text control

Works fine with Oracle data control.

Picture box and Image control

The MS Picture box and MS Image Control work with the Oracle Data Control in both Visual Basic 4.0 and Visual Basic 5.0.

Long Raw data displayed through the Oracle Data Control is read only. To do adds or updates to Long Raw requires use of code. See the AppendChunk method example code in the online help for more information. We recommend you migrate the Long Raw over to BLOB column type which is writeable by the Data Control and can be significantly faster.

Microsoft OLE Container Control

Write operations which occur after activation of the OLE object do not work properly in VB 4.0. The object written to the database is corrupt. This works correctly  in VB 5.0.

Microsoft Data Bound Listbox control

Does not respond to ORADC.UpdateRecord. Instead use MoveNext or MovePrevious to force the update.

Microsoft Data Bound Combobox control

Does not respond to ORADC.UpdateRecord. Instead use MoveNext or MovePrevious to force the update.

Microsoft Data Bound Grid control

Whenever the Data Control?s underlying Recordset is moved to EOF or BOF, the grid will not paint properly if the user attempts to use it while in that state. So, each time you are finished using ORADC1.Recordset in your code it is advisable to check for BOF and EOF, and if it true, do a MoveFirst followed by a MoveLast in the case of EOF or MoveLast followed by MoveFirst in the case of BOF. This will cause the rows to be repainted.

The Scroll (DBGRID.Scroll) method of the grid will not work.

The Refresh (DBGRID.Refresh) method of the grid will not work. Use ORADC.Recordset.Refresh instead.

Deleting a row using the delete key on the keyboard causes the current row to jump ahead 2 rows rather than one. Workaround is to use a button associated with the code ORADC.Recordset.Delete.

MSGRID bookmarks (DBGRID.Bookmark) and Oracle Objects bookmarks (ORADC.Recordset.Bookmark) are not compatible. Setting the ORADC.Recordset.Bookmark property to a bookmark obtained from DBGRID.Bookmark will result in an OIP-4121. Similarly, populating the grid?s SelBookmarks collection with bookmarks obtained from ORADC.Recordset.Bookmarks will result in some rows not properly selected.

To workaround the problem, do not share bookmarks between Oracle Objects and the MSGrid.

That is, only set DBGrid1.Bookmark property to a bookmark that you obtained from DBGrid1.Bookmark. Only set ORADC.Recordset.Bookmark to a bookmark that you obtained from ORADC.Recordset.Bookmark.

For example, use:

DBGrid1.Bookmark = DBGRID.SelBookmarks(0)

instead of

ORADC.Recordset.Bookmark = DBGRID.SelBookmarks(0)

MSGRID SelBookmarks property doesn't work with ORADC.Recordset.Bookmark

Setting the ORADC.Recordset.Bookmark property to a bookmark obtained from DBGRID.Bookmark will result in an OIP-4121. Similarly, populating the grid's SelBookmarks collection with bookmarks obtained from ORADC.Recordset.Bookmarks will result in some rows not properly selected.

To workaround the problem, do not share bookmarks between Oracle Objects and the MSGrid.

For example, use:

DBGrid1.Bookmark = DBGRID.SelBookmarks(0) instead of ORADC.Recordset.Bookmark = DBGRID.SelBookmarks(0)

Sheridan Data Widgets

Tested Version: 3.0 Build 34

Sheridan Data Bound Combo control

Updates database with NULL for any update. Use MS Combo box until this is resolved.

Sheridan Data Bound Dropdown control

No known issues.

Sheridan Data Bound Grid control

Whenever the Data Control?s underlying Recordset is moved to EOF or BOF, the grid will not paint properly if the user attempts to use it while in that state. So, each time you are finished using ORADC1.Recordset in your code it is advisable to check for EOF or BOF, and if it is true, do a MoveLast in the case of EOF, and do a MoveLast followed by a MoveFirst in the case of BOF.

Doing a delete when no rows are visible on grid (this can happen when you delete every row that is visible on the grid when there are more rows than one page worth), followed by doing a delete on the empty looking grid will cause repainting problems. This should only be an issue if you have a loop of ORADC.Recordset.Delete since the user will not normally delete a row when one is not visible. One possible workaround is to add a MovePrevious followed by a MoveNext to each delete in the loop. This will cause Sheridan to keep at least one row visible on the grid throughout the deletes and will avoid the problem. Another workaround is to refresh after doing the deletes.

Performing AddNew on underlying dynaset (ORADC.Recordset.AddNew) when dynaset has not been fully fetched yet will result in OIP-4118 error. Workaround is do a MoveLast to force a full fetch, then call AddNew.

Related to the above problem, there may be other cases where Sheridan does not move to the last row when it is supposed to when all the rows have not yet been fetched. For example, this may occur when you call MoveLast on the grid itself (Grid.MoveLast) prior to all rows being fetched. To workaround any problem like that, call MoveLast on the underlying dynaset instead

(ORADC.Recordset.MoveLast).

Related to above problem, MoveRecords method of grid will move to the last row of all rows fetched so far if not all rows have been fetched yet.

The Refresh method of the grid (SSDBGRID1.Refresh) will do nothing. Use ORADC.Recordset.Refresh instead.

Sheridan Enhanced Data Control

Works fine with Oracle Data Control except for Find functionality which only works for "equals" case and only when no rows have been deleted.

FarPoint Data Bound Grid Control

Tested Version: 2.5.020

Access Violations will occur when bound to Long Raw when size of long raw minus 118 bytes is multiple of 32k. Farpoint has confirmed this bug and it should be fixed in a maintenance release of Spread. Please contact Farpoint for more information about how to obtain a fix.

After deleting the last row in the grid, Farpoint will not reposition on the new last row. Continuing to delete will succeed in deleting the new last row, but the deleted rows will not disappear from the grid. To workaround this add a MovePrevious and MoveNext to each delete in your code or call refresh when done deleting.
 

Oracle Class Libraries

Class Library does not yet support new OO4O objects, properties and methods

The class library provided with this release is equivalent to one provided in version 2.3. None of the new functionality has been exposed yet. This will become available in a future release. Users wishing to use the new functionality of oo4o from C++ immediately can use the #import facility of Visual C++ which creates wrapper objects for the interfaces in OIP8.TLB. Care must be taken using this approach that all object references are released or else object and connection leaks may result.

Error: CoInitializeEx() not found in OLE32.DLL

You will receive an error similar to this one if you use the Class Libraries with an older version of Win95, and you call OStartup() with the MultiThreading option. To correct this you need to obtain NT 4.0, or the DCOM patch for Windows 95.

Bound control libraries (OMFC4x.LIB) support under MSVC 4.2 or later.

The current release of OMFC40.LIB is supported only for the MSVC 4.0 compiler. Because different versions of the MSVC 4.x compiler require different OMFC4x.LIB libraries, this release provides the OMFC40.MAK in the \{ORACLE_HOME}\oo4o\cpp\mfc directory. With this, client can built their own OMFC libraries for their versions of compilers.

Using the data control with VC++

An error condition will cause an exception in MFC42.DLL. For example while running a VC++ application with the data control an invalid data input which should otherwise generate an OIP error will cause an unhandled exception in MFC42.DLL.

IIS/ASP

IIS 4.0

In the IIS 4.0 you need to use the <OBJECT> tag for instantiating OO4O.

<OBJECT RUNAT=Server SCOPE=Application ID=OraSession PROGID="OracleInProcServer.XOraSession"></OBJECT>

You can then access the OraSession object by simply referring to it without using the Application("OraSession") syntax. The SCOPE=Application takes care of it.

The following is a sample global.asa file.

<OBJECT RUNAT=Server SCOPE=Application ID=OraSession PROGID="OracleInProcServer.XOraSession"></OBJECT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
End Sub

Sub Application_OnEnd
End Sub

</SCRIPT>

Reading Long/Long raw columns in ASP

You have to use OraField object's method GetChunkByteEx to read Long/Long raw columns from ASP. See the online help for more information. Oracle recommends that you use LOBs instead.
 

FTP Site for Patches and Updates

You can make sure you have the latest version of oo4o by checking the following site:
ftp://external-ftp.us.oracle.com/dev_tools/outgoing/oo4o/win32/Oracle8i/
 
 
 

Prev
Oracle
Copyright © 1999 Oracle Corporation.
All Rights Reserved.

Library