Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
29407 Discussions

Opening Recordsets - Fortran thru ADO?

msrado
Beginner
836 Views
Hello everyone,
I am trying to ADO from Compaq Visual Fortran v6.1. I have created an ADO module with the Fortran Module Wizard and have some base code that compiles and links. My ADO connection and recordset are created without errors. The connection opens without errors. But when I try to use the $Recordset_Open subroutine, I get an unknown status code (-2147352567).
Does anyone know what I'm doing wrong? The code is below:
program main
USE DFWIN
USE DFLIB
USE TestADO
USE DFCOM
USE DFAUTO
USE DFCOMTY
USE RTObjs
implicit none
C
C VARIABLES
INTEGER*4 STATUS
integer*4 aa
integer*4 iStatic
integer*4 iReadOnly
integer*4 iCmd
TYPE (VARIANT) :: vBSTR1
TYPE (VARIANT) :: vCONINT

C INITIALIZE OBJECT POINTERS
CALL INITOBJECTS()
C
C CREATE ADO Connection
CALL COMINITIALIZE(STATUS)
CALL COMCREATEOBJECT("ADODB.Connection", ADOConn, status)
IF(ADOConn.eq.0)then
write(6,*)"Cannot connect to ADO connection object."
goto 999
endif
c
c create ADO recordset
CALL COMCREATEOBJECT("ADODB.Recordset", ADORecSet, status)
if(ADORecSet.eq.0)then
write(6,*)"Cannot connect to ADO recordset object."
goto 999
endif
c
c open ado connection
call $Connection_Open(ADOConn,"Driver={SQLServer};Server=SERVER
*;Database=DBName;Network=DBMSSOCN;", "User", "password", 0,
*STATUS)
c
c open recordset
C FIRST SET UP BSTR1 = SQL QUERY
CALL VariantInit(vBSTR1)
vBSTR1%VT = VT_BSTR
bstr1 = ConvertStringToBSTR('SELECT * FROM TableName')
vBSTR1%VU%PTR_VAL = bstr1
C NEXT SET UP ADOCONN VARIANT
CALL VariantInit(vCONINT)
vCONINT%VT = VT_I4
vCONINT%VU%LONG_VAL = ADOConn
C
iStatic = adOpenStatic
iReadOnly = adLockReadOnly
iCmd = adCmdTable
call $Recordset_Open(ADORecSet, vBSTR1, vCONINT,
*iStatic, iReadOnly, iCmd, STATUS)
if(status.ne.adStatusOK)then
write(6,*)"Can't open recordset",STATUS
goto 999
else
write(6,*)ADORecSet!Teeth
endif
999 read(5,*)aa
continue
end
Many thanks in advance!
Robin
0 Kudos
1 Reply
msrado
Beginner
836 Views
Hello all,
I figured it out! When opening the recordset, I shouldn't be passing the pointer to the connection object in the vCONINT variant. Instead, I should pass the connection string. That eliminates the need to monkey around with a connection object, too, so the code gets a little nicer.
Here's what my final code looked like:
program main
USE DFWIN
USE DFLIB
USE TestADO
USE DFCOM
USE DFAUTO
USE DFCOMTY
USE RTObjs
implicit none
C
C VARIABLES
INTEGER*4 STATUS
integer*4 iStatic
integer*4 iReadOnly
integer*4 iCmd
TYPE (VARIANT) :: vBSTR1
TYPE (VARIANT) :: vCONINT
TYPE (VARIANT) :: vTName
integer*2 i
c
write(6,*)"Connecting to database. Please wait ...."
c
C INITIALIZE OBJECT POINTERS
CALL INITOBJECTS()
CALL COMINITIALIZE(STATUS)
c
c create ADO recordset
CALL COMCREATEOBJECT("ADODB.Recordset", ADORecSet, status)
if(ADORecSet.eq.0)then
write(6,*)"Cannot connect to ADO recordset object."
goto 999
endif
c
c open recordset
C FIRST SET UP BSTR1 = SQL QUERY
CALL VariantInit(vBSTR1)
vBSTR1%VT = VT_BSTR
bstr1 =
*ConvertStringToBSTR("SELECT * FROM Cut_Summary_InputDat")
vBSTR1%VU%PTR_VAL = bstr1
C NEXT SET UP Connection string VARIANT
CALL VariantInit(vCONINT)
vCONINT%VT = VT_BSTR
bstr1 =
*ConvertStringToBSTR("Driver={SQL Server};Server=SERVER;"//
*"Database=DBNAME;Network=DBMSSOCN;Uid=UID;Pwd=PASSWORD")
vCONINT%VU%PTR_VAL = bstr1
C
iCmd = adCmdUnspecified
iStatic = adOpenStatic
iReadOnly = adLockReadOnly
call $Recordset_Open(ADORecSet, vBSTR1, vCONINT,
*iStatic, iReadOnly, iCmd, STATUS)
if(status.ne.0)then
write(6,*)"Can't open recordset",STATUS
goto 999
else
c
c show first record field
CALL VariantInit(vBSTR1)
vBSTR1%VT = VT_BSTR
bstr1 =
* ConvertStringToBSTR("Field")
vBSTR1%VU%PTR_VAL = bstr1
ADOField = Fields_GetItem(ADORecSet, vBSTR1, STATUS)
call VariantInit(vTName)
vTName = Field_GetValue(ADOField, STATUS)
i = vTName%VU%SHORT_VAL
write(6,*)'Field = ',i
endif
c
c CLOSE RECORDSET
call $Recordset_Close(ADORecSet, STATUS)
CALL RELEASEOBJECTS()
CALL COMUNINITIALIZE()
c
999 continue
end program
Hope this helps anyone else who's going through the same learning curve!
Robin
0 Kudos
Reply