" *****************************************************************************************************
*
*  putdata.txt
*
*   This examples shows how to use putdata 
*
*
******************************************************************************************************"

|connection1  aTextDisplay connectString statement1 sqlStatement numParms parmValue
    parmSqlType appValue|

aTextDisplay := TextWindow  windowLabeled: 'ODBC Interface - Using putdata'
                           frame: (0 @ 0 corner: 500 @ 500).
aTextDisplay cr.



" *** Open the connection ****"
connection1 := OdbcConnection open.
connection1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: connection1 getMessage; cr
    ].



" *** Driver  Connect ***  "
connectString :=  connection1 driverConnect: '' window: aTextDisplay
        driverCompletion: (OdbcDriverCompletions at: 'DRIVERPROMPT').

connection1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: connection1 getMessage; cr
    ].

" *** allocate a new statement *** "
statement1:= connection1 newStatement.
statement1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].

sqlStatement:= Prompter prompt: 'Enter a SQL statement with parameter markers:' default: ''.



"*** prepare   ***"
statement1 prepare: sqlStatement.
statement1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].

" *** count the number of parameters - do not use NumParams (level 2) in this example "
numParms := sqlStatement occurrencesOf: $?.

1 to: numParms do:
    [ :ipar |
             statement1 setParamAtExec: ipar fSqlType: 1 .
    ].
statement1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].


"*** execute the statement  ***"
statement1 execute.
statement1 hasError
    ifFalse:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].


" We should get a return of SQLNEEDDATA "  
statement1 hasSqlNeedData
    ifTrue: [
       statement1 paramData.
        [statement1 hasSqlNeedData]
            whileTrue:[
                parmValue := Prompter prompt: 'Enter the value for parameter:' default: ''.
                statement1 putData: parmValue.
                statement1 paramData.
                ].
    ].        

 statement1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].

    
"*** bind the columns - could be done after prepare or Execute  ***"
aTextDisplay nextPutAll: 'NumberOfColumns: '
                        ; nextPutAll: (statement1 bindColumns asString); cr.
statement1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].


"*** fetch the rows and display the values ***"

statement1 fetch.
   [statement1 hasSuccess]
        whileTrue: [
            1 to: statement1 numberOfColumns do:
                [ :icol |
                        aTextDisplay nextPutAll: (statement1 colValue: icol) asString ; tab
                ].
             aTextDisplay cr.
             statement1 fetch.
      ].
statement1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].


"*** free the statement *** "
statement1 free: (OdbcConstants at: 'SQLDROP').
statement1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: statement1 getMessage; cr
    ].

" *** disconnect *** "
connection1 disconnect.
connection1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: connection1 getMessage; cr
    ].


" *** free the connection *** "

connection1 free.
connection1 hasError
    ifTrue:
    [    aTextDisplay nextPutAll: connection1 getMessage; cr
    ].


aTextDisplay cr ; nextPutAll: '*** finished executing ***'.
