This VB6 tutorial explains how you can access an Oracle database from within Visual Basic. It is a bit short as it was thrown together from a post on the vbforums.com page. However if you check out the Sample VB6 and Oracle Source Code that goes along with it. You should be able to easily understand what is going on. Read on and enjoy as you develop your Visual Basic Oracle application.
Oracle databases have been around for years, and although they are not as popular as their Microsoft counterpart, many business rely on Oracle backends for all their needs. Because of this, we must know how to interface with an Oracle database from within our VB6 application. This VB6 tutorial will walk us through exactly how to do this.
To access an Oracle database it is very similar to how you access any other database. We can simply use an ADO Connection object. We set the provider to be our Oracle provider and setup our connection string and password.
Set dbConn = New ADODB.Connection With dbConn .Provider = "OraOLEDB.Oracle" .Properties("Data Source") = "DatabaseName" .Properties("User Id") = "someuser" .Properties("Password") = "somepassword" .Open End With
After we setup the connection all we do next is setup an ADO Command object that will be used with our oracle database. This is the same things we do for any Visual Basic database application.
Set Cmd = New ADODB.Command Set Cmd.ActiveConnection = dbConn With Cmd .Parameters.Append .CreateParameter(, adVarChar, adParamOutput, 50) .Parameters.Append .CreateParameter(, adNumeric, adParamOutput) End With
Now is where things start being specific to our Oracle database. Getting a result set back from an Oracle SP is not as simple as it is in SQL Server. The results must come back to the calling program in something called a reference cursor (ref cursor). This will discuss what a ref cursor is and how to implement them and get data back.
Oracle creates an implicit cursor for every select query (I think that is the same for any database system). The cursor is simple the recordset results. If you are not going to use that result set for anything else (ie: to generate another query to execute) then you do not need to declare a cursor. But to get the result set out of Oracle you need something that is called a ref cursor. This ref cursor is more or less the same as and ADO recordset. You declare the ref cursor in code some where on the Oracle database, that ref cursor (sort of a structure in .Net) is then listed as an In and Out parameter of the SP.
You generate the select statement you want to run then open the ref cursor you created as follows:
Open cRefCur For Select ....... (columns form whatever tables) From (table names) Where (conditions and Joins).Standard SQL here with one big exception since if using Oracle 8i or earlier, Oracle at that release level did not support the Inner and Outer Join statements. You must use the Oracle version of them. Inners are just and equal sign as in Sales.ProductID = Prodcuts.ProductID. The Outer join is a lot messier, outer joins use the same equals sign and also a plus (+) sign on the deficient side of the equal sign.
CREATE OR REPLACE PACKAGE cv_types AS TYPE WellData IS RECORD( WellName Varchar2(50), ResultsCount Number ); TYPE CV_WEllData IS REF CURSOR RETURN WellData; End; /Next we create a stored procedure that will use that ref cursor declared above:
Create Or Replace Procedure WellCounting ( pWellName OUT VARCHAR2, pCount OUT NUMBER, rsWellData IN OUT cv_types.CV_WEllData) AS BEGIN Open rsWellData For Select Wells.WELLNAME,Count(RESULTS.WELLID) Into pWellName, pCount From Wells, Results Where Wells.WellID = Results.WellID group by WEllName; EXCEPTION WHEN OTHERS THEN ROLLBACK WORK; RAISE; End WellCounting; /We can then call the stored procedure from VB as shown in the included VB Projects.
Create Or Replace Procedure OneWellCount ( pWellID IN Number, pWellName OUT VARCHAR2, pCount OUT NUMBER, rsWellData IN OUT cv_types.CV_WEllData ) AS BEGIN Open rsWellData For Select Wells.WELLNAME,Count(RESULTS.WELLID) Into pWellName, pCount From Wells, Results Where Wells.WellID = pWellID And Wells.WellID = Results.WellID group by WEllName; EXCEPTION WHEN OTHERS THEN ROLLBACK WORK; RAISE; End OneWellCount; /We can also test these procedures (and ref cursors) from the SQL*Plus prompt by doing the following: