04130324.txt 13-Apr-00


SQLSelect:Execute(), NT and MSAccess 2000

From willchapman@dial.pipex.com Fri Mar 31 00:51:56 2000
Subject: SQLSelect:Execute(), NT and MSAccess 2000

I have a call to SQLSelect:execute() in an app that runs
perfectly on my system which is Win98 and has Access 97
installed.

On a customers system - running NT and MS Access 2000 - the
SQLSelect:Execute() refuses to work. Can anyone give me any
clues as to why this might be? I've seen posts on other
forums that suggest that Access is not fully backward
compatible.

Thanks in advance..

Will Chapman


From alison@bradburyphillips.co.uk Fri Mar 31 03:41:09 2000
Subject: Re: SQLSelect:Execute(), NT and MSAccess 2000

There is a bug in SQLSelect to do with parameters - is that
relevant? I have a workaround for it, if you need it

I'm running under NT with Access 97, and the system is
working on Win98 machines with Access 97. - Also I tried to
look at my Access database using an early version of Access
and couldn't get in - clearly there are some issues with
backward compatibility.

Alison


From willchapman@dial.pipex.com Fri Mar 31 21:15:18 2000
Subject: Re: SQLSelect:Execute(), NT and MSAccess 2000

Alison

It might be a factor so if you could let me see the work-
around I'll take a look.

By the way if you are accessing MDB files I have found
VO2Jet to be much faster than the in-built VO-SQL
methods/classes (I'm using it almost entirely in this
current app but need VO's SQLSelect to grab hold of a Text
CSV file via ODBC).

Thanks..

Will


From alison@bradburyphillips.co.uk Sat Apr 01 00:52:23 2000
Subject: Re: SQLSelect:Execute(), NT and MSAccess 2000

Adding this code into my app has allowed me to use
parameters with SQLSelect. Credit goes to John Parker.


METHOD NewSelectedCount( ) CLASS SQLSelect
  LOCAL cStatement    AS STRING
  LOCAL cCount        AS STRING
  LOCAL nPos          AS INT
  LOCAL l             AS LONG
  LOCAL nRet          AS LONG
  LOCAL nRetCode      AS LONG
  LOCAL oCount        AS SQLStatement
  LOCAL oConn         AS SQLConnection
  LOCAL pLong         AS PTR
  LOCAL pData         AS PTR
  LOCAL aStatArg  AS ARRAY
  LOCAL nCount  AS INT
  LOCAL pNullInd  AS PTR

  IF ! lCsrOpenFlag
    IF ! SELF:Execute()
      RETURN 0
    ENDIF
  ENDIF

  IF (oStmt:RecCount > -1)
    RETURN oStmt:RecCount
  ENDIF

  pNullInd := NULL_PTR
  nRet := 0L
  cStatement := SELF:oStmt:SQLString

  nPos := AtC("ORDER BY", cStatement)
  IF nPos > 0
    cStatement := Left(cStatement,nPos-1)
  ENDIF

  nPos :=  AtC("FROM", cStatement)

  IF nPos > 0
    cCount := "SELECT COUNT (*) " + SubStr(cStatement, nPos)
  ELSE
    cCount := "SELECT COUNT (*) " + SELF:cTableName
  ENDIF

  IF oStmt:Connection:nActiveStmts = 1
    oConn := SQLConnection{ oStmt:Connection:DataSource, ;
    oStmt:Connection:UserID,     ;
    oStmt:Connection:Password }
    IF !oConn:Connected
      SELF:__CopySQLError( #__RecCount, oConn:ErrInfo )
      RETURN nRet
    ENDIF

    oCount := SQLStatement{ cCount, oConn }
  ELSE
    oCount := SQLStatement{ cCount, oStmt:Connection }
  ENDIF
  nCount := ALen( oStmt:__Params )
  aStatArg := oStmt:__Params
  IF nCount > 0

    pNullInd := MemAlloc( nCount* _sizeof(LONGINT) * 2 )

    IF pNullInd = NULL_PTR
     RETURN nRet
    ENDIF

    IF ! oCount:__SetParameters( AStatArg, pNullInd )
     MemFree( pNullInd )
     RETURN nRet
    ENDIF
  ENDIF

  oCount:SQLString := SELF:PreExecute( oCount:SQLString )

  pData := MemAlloc( _SIZEOF(LONG) )

  IF pData = NULL_PTR
    IF pNullInd != NULL_PTR
      MemFree( pNullInd )
    ENDIF
    RETURN nRet
  ENDIF

  pLong := MemAlloc( _SIZEOF(LONG) )

  IF pLong == NULL_PTR
    IF pNullInd != NULL_PTR
      MemFree( pNullInd )
    ENDIF
    MemFree(pData)
    RETURN nRet
  ELSE
    LONG(pLong) := 0L
  ENDIF

  nRetCode := SQLBindCol( oCount:StatementHandle, 1,  ;
    SQL_C_SLONG ,               ;
    pData,                      ;
    4,                          ;
    pLong )

  IF nRetCode == SQL_SUCCESS
    oCount:ScrollConcurrency := SQL_CONCUR_READ_ONLY
    l := SLen( cCount )
    nRetCode := SQLExecDirect( oCount:StatementHandle, ;
      PTR( _CAST, cCount ), l )

    IF nRetCode = SQL_SUCCESS .or. ;
      nRetCode = SQL_SUCCESS_WITH_INFO
      nRetCode := SQLFetch( oCount:StatementHandle )
      IF nRetCode == SQL_SUCCESS
          nRet := LONG(pData)
          SELF:nlastRecNum   := nRet
          SELF:lLastRecFound := .T.
      ENDIF
    ENDIF
  ENDIF

  MemFree(pData)
  MemFree(pLong)

  IF pNullInd != NULL_PTR
    MemFree( pNullInd )
  ENDIF

  oCount:FreeStmt( SQL_DROP )

  IF oStmt:Connection:nActiveStmts = 1
    oConn:__Free()
  ENDIF

RETURN nRet


From willchapman@dial.pipex.com Sat Apr 01 02:49:34 2000
Subject: Re: SQLSelect:Execute(), NT and MSAccess 2000

Thanks Alison (and John too!)

Cheers..

Will


From ferber@richsoftware.com Fri Mar 31 04:47:44 2000
Subject: Re: SQLSelect:Execute(), NT and MSAccess 2000

Will,

I just had a similiar problem with Access2000 and Windows
2000 and I created a SQL test application and there the name
of the table was in delimited with the [`] character. Took
it into my code and works now fine.

Michael


From willchapman@dial.pipex.com Fri Mar 31 21:18:51 2000
Subject: Re: SQLSelect:Execute(), NT and MSAccess 2000

That looks promising - I'll investigate...

Thanks...

Will

    Source: geocities.com/n_s_wong/vo/ng

               ( geocities.com/n_s_wong/vo)                   ( geocities.com/n_s_wong)