List:Commits« Previous MessageNext Message »
From:pharvey Date:December 8 2006 2:01pm
Subject:Connector/ODBC 5 commit: r720 - in trunk/Driver/examples/c: Batch1 BoundParameters1
View as plain text  
Modified:
   trunk/Driver/examples/c/Batch1/main.c
   trunk/Driver/examples/c/Batch1/qmake.pro
   trunk/Driver/examples/c/BoundParameters1/main.c
Log:
most of example batch1 ready

Modified: trunk/Driver/examples/c/Batch1/main.c
===================================================================
--- trunk/Driver/examples/c/Batch1/main.c	2006-12-08 11:53:14 UTC (rev 719)
+++ trunk/Driver/examples/c/Batch1/main.c	2006-12-08 13:01:24 UTC (rev 720)
@@ -1,8 +1,7 @@
 /*!
-    \brief  Advanced example of bound parameters.
+    \brief  Basic example of batched commands.
 
-            This example demonstrates chunking data in using SQLParamData/SQLPutData 
-            and chunking data out using SQLGetData.
+            This example demonstrates the basic use of batched commands.
 */
 #include <stdio.h>
 #include <windows.h>
@@ -10,19 +9,29 @@
 #include <sqlext.h>
 
 #define TABLE_DATA_ROWS 10
+#define TABLE_DATA_COL_MAX 255
 #define MESSAGE_MAX 1024
+#define ROWCOUNTS 11
+#define RESULTSETS 1
 
-#define CHUNKS 3
-#define CHUNK_SIZE 50
+const char *    pszSyntax       = "\nSyntax:\n\n\tBatch1 DSN UID PWD\n";
+SQLCHAR *       pszTable        = "BATCH1";
+SQLCHAR *       pszCreateTable  = "CREATE TABLE Batch1 ( nID NUMERIC(6), vcName
VARCHAR(255) )";
+SQLCHAR *       pszDropTable    = "DROP TABLE Batch1";
+SQLCHAR *       pszBatchedCommands   = \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 0, 'zero' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 1, 'one' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 2, 'two' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 3, 'three' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 4, 'four' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 5, 'five' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 6, 'six' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 7, 'seven' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 8, 'zzz' );" \
+"INSERT INTO Batch1 ( nID, vcName ) VALUES ( 9, 'nine' );" \
+"UPDATE Batch1 SET vcName = 'eight' WHERE nID = 8;" \
+"SELECT * FROM Batch1 WHERE nID = 8";
 
-const char *    pszSyntax       = "\nSyntax:\n\n\tBoundParameters2 DSN UID PWD\n";
-SQLCHAR *       pszTable        = "PARAM2";
-SQLCHAR *       pszCreateTable  = "CREATE TABLE Param2 ( nID NUMERIC(6), vcName
VARCHAR(255) )";
-SQLCHAR *       pszDropTable    = "DROP TABLE Param2";
-SQLCHAR *       pszInsertData   = "INSERT INTO Param2 ( nID, vcName ) VALUES ( ?, ? )";
-SQLCHAR *       pszSelectData   = "SELECT * FROM Param2 WHERE nID = ?";
-SQLCHAR *       pszChunk        = "01234567890123456789012345678901234567890123456789";
-
 void doDumpErrors( const char *pszFile, const char *pszFunction, int nLine, SQLSMALLINT
nHandleType, SQLHANDLE hHandle )
 {
     SQLRETURN   nReturn;
@@ -46,7 +55,6 @@
     SQLRETURN   nReturn;
     SQLLEN      nRowCount = 0;
 
-    /* Some drivers are ok with SQL_NTS being used for NULL strings (MS SQL Server 2000
for example) but others need 0 len (DB2 9 for example). */
     nReturn = SQLTables( hStmt, pszCatalog, ( pszCatalog ? SQL_NTS : 0 ), pszSchema, (
pszSchema ? SQL_NTS : 0 ), pszTable, ( pszTable ? SQL_NTS : 0 ), pszType, ( pszType ?
SQL_NTS : 0 ) );
     if ( !SQL_SUCCEEDED( nReturn ) )
     {
@@ -73,116 +81,61 @@
     return nRowCount;
 }
 
-SQLRETURN doInsertData( SQLHSTMT hStmt )
+SQLRETURN doBatchedCommands( SQLHSTMT hStmt )
 {
-    SQLSMALLINT nID;
-    SQLINTEGER  nIDLen              = 0;
-    SQLINTEGER  nNameLen;
+    SQLCHAR     szName[TABLE_DATA_COL_MAX + 1];
+    SQLINTEGER  nNameLenInd = SQL_NTS;
     SQLRETURN   nReturn;
-    int         nParameterToChunk   = 2;
-    int         nChunk;
-    SQLPOINTER  pAppData;
+    SQLSMALLINT nColumns    = 0;
+    int         nRowCounts  = 0;
+    int         nResultSets = 0;
 
-    nReturn = SQLPrepare( hStmt, pszInsertData, SQL_NTS );
+    nReturn = SQLPrepare( hStmt, pszBatchedCommands, SQL_NTS );
+    if ( !SQL_SUCCEEDED( nReturn ) )
+    {
+        doDumpErrors( __FILE__, __FUNCTION__, __LINE__, SQL_HANDLE_STMT, hStmt );
+        return nReturn;
+    }
 
-    nReturn = SQLBindParameter( hStmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0,
0, &nID, 0, &nIDLen );
-    nReturn = SQLBindParameter( hStmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 0, 0,
(SQLPOINTER)nParameterToChunk, 0, &nNameLen ); 
+    nReturn = SQLExecute( hStmt );
 
-    nNameLen = SQL_LEN_DATA_AT_EXEC(0);
-
-    for ( nID = 0; nID < TABLE_DATA_ROWS; nID++ )
+    do
     {
-        nReturn = SQLExecute( hStmt );
-        if ( nReturn == SQL_NEED_DATA )
+        if ( !SQL_SUCCEEDED( nReturn ) )
         {
-            while ( nReturn == SQL_NEED_DATA) 
-            {
-                nReturn = SQLParamData( hStmt, &pAppData );
-                if ( nReturn == SQL_NEED_DATA) 
-                {
-                    if ( (int)pAppData != nParameterToChunk )
-                    {
-                        printf( "[ERROR][%s][%s][%d] pAppData != nParameterToChunk\n",
__FILE__, __FUNCTION__, __LINE__ );
-                        return SQL_ERROR;
-                    }
-
-                    for ( nChunk = 0; nChunk < CHUNKS; nChunk++ )
-                    {
-                        SQLPutData( hStmt, pszChunk, CHUNK_SIZE );
-                    }
-                }
-            }
+            doDumpErrors( __FILE__, __FUNCTION__, __LINE__, SQL_HANDLE_STMT, hStmt );
+            return nReturn;
         }
-        else if ( !SQL_SUCCEEDED( nReturn ) )
+
+        nReturn = SQLNumResultCols( hStmt, &nColumns );
+        if ( !SQL_SUCCEEDED( nReturn ) )
         {
             doDumpErrors( __FILE__, __FUNCTION__, __LINE__, SQL_HANDLE_STMT, hStmt );
-            break;
+            return nReturn;
         }
+
+        if ( nColumns > 0 )
+            nResultSets++;
         else
-        {
-            printf( "[ERROR][%s][%s][%d] SQLExecute != SQL_NEED_DATA\n", __FILE__,
__FUNCTION__, __LINE__ );
-            return SQL_ERROR;
-        }
-    }
+            nRowCounts++;
 
-    return nReturn;
-}
+        nReturn = SQLMoreResults( hStmt );
 
-SQLRETURN doSelectData( SQLHSTMT hStmt )
-{
-    SQLSMALLINT nID;
-    SQLINTEGER  nIDLen      = 0;
-    SQLCHAR     szName[CHUNK_SIZE * CHUNKS + 1];
-    SQLINTEGER  nBytesRemaining;
-    int         nChunk;
-    SQLRETURN   nReturn;
+    } while ( nReturn != SQL_NO_DATA );
 
-    nReturn = SQLPrepare( hStmt, pszSelectData, SQL_NTS );
-
-    nReturn = SQLBindParameter( hStmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0,
0, &nID, 0, &nIDLen );
-
-    nID = TABLE_DATA_ROWS - 1;
-
-    nReturn = SQLExecute( hStmt );
-    if ( !SQL_SUCCEEDED( nReturn ) )
+    if ( nResultSets != RESULTSETS )
     {
-        doDumpErrors( __FILE__, __FUNCTION__, __LINE__, SQL_HANDLE_STMT, hStmt );
-        return nReturn;
-    }
-
-    nReturn = SQLFetch( hStmt );
-    if ( nReturn == SQL_NO_DATA )
-    {
-        printf( "[ERROR][%s][%s][%d] nReturn == SQL_NO_DATA\n", __FILE__, __FUNCTION__,
__LINE__ );
+        printf( "[ERROR][%s][%s][%d] nResultSets = %d expected %d.\n", __FILE__,
__FUNCTION__, __LINE__, nResultSets, RESULTSETS );
         return SQL_ERROR;
     }
-    else if ( !SQL_SUCCEEDED( nReturn ) )
-    {
-        doDumpErrors( __FILE__, __FUNCTION__, __LINE__, SQL_HANDLE_STMT, hStmt );
-        return nReturn;
-    }
 
-    nChunk = 0;
-    do 
+    if ( nRowCounts != ROWCOUNTS )
     {
-        nReturn = SQLGetData( hStmt, 2, SQL_C_CHAR, &(szName[nChunk * CHUNK_SIZE]),
CHUNK_SIZE + 1, &nBytesRemaining );
-        if ( !SQL_SUCCEEDED( nReturn ) && nReturn != SQL_NO_DATA_FOUND )
-        {
-            doDumpErrors( __FILE__, __FUNCTION__, __LINE__, SQL_HANDLE_STMT, hStmt );
-            return nReturn;
-        }
-        nChunk++;
-    } while ( nReturn != SQL_NO_DATA_FOUND );
-
-    nReturn = SQL_SUCCESS;
-
-    if ( strncmp( &(szName[(CHUNKS - 1) * CHUNK_SIZE]), pszChunk, CHUNK_SIZE ) != 0 )
-    {
-        printf( "[ERROR][%s][%s][%d] Last chunk not correct (%s).\n", __FILE__,
__FUNCTION__, __LINE__, &(szName[(CHUNKS - 1) * CHUNK_SIZE]) );
+        printf( "[ERROR][%s][%s][%d] nRowCounts = %d expected %d.\n", __FILE__,
__FUNCTION__, __LINE__, nRowCounts, ROWCOUNTS );
         return SQL_ERROR;
     }
 
-    return nReturn;
+    return SQL_SUCCESS;
 }
 
 int main( int argc, char *argv[] )
@@ -196,6 +149,10 @@
     SQLCHAR *   pszPWD      = argv[3];
     int         nTableCount;
 
+    SQLCHAR     szMultiResultSets[5];
+    SQLUINTEGER nBatchRowCount  = 0;
+    SQLUINTEGER nBatchSupport   = 0;
+
     printf( "[BEGIN][%s][%s][%d]\n", __FILE__, __FUNCTION__, __LINE__ );
 
     if ( !pszDSN || !pszUID || !pszPWD )
@@ -216,6 +173,27 @@
         goto mainExit1;
     }
 
+    *szMultiResultSets = '\0';
+    nReturn = SQLGetInfo( hDbc, SQL_MULT_RESULT_SETS, szMultiResultSets,
sizeof(szMultiResultSets), NULL );
+    nReturn = SQLGetInfo( hDbc, SQL_BATCH_ROW_COUNT, &nBatchRowCount,
sizeof(nBatchRowCount), NULL );
+    nReturn = SQLGetInfo( hDbc, SQL_BATCH_SUPPORT, &nBatchSupport,
sizeof(nBatchSupport), NULL );
+    /* for advanced: SQL_PARAM_ARRAYS_ROW_COUNTS, SQL_PARAM_ARRAYS_SELECTS */
+
+    printf( "SQL_MULT_RESULT_SETS.......................... %c\n", *szMultiResultSets );
+    printf( "SQL_BATCH_ROW_COUNT::SQL_BRC_ROLLED_UP........ %d\n", nBatchRowCount &
SQL_BRC_ROLLED_UP );
+    printf( "SQL_BATCH_ROW_COUNT::SQL_BRC_PROCEDURES....... %d\n", nBatchRowCount &
SQL_BRC_PROCEDURES );
+    printf( "SQL_BATCH_ROW_COUNT::SQL_BRC_EXPLICIT......... %d\n", nBatchRowCount &
SQL_BRC_EXPLICIT );
+    printf( "SQL_BATCH_SUPPORT::SQL_BS_SELECT_EXPLICIT..... %d\n", nBatchSupport &
SQL_BS_SELECT_EXPLICIT );
+    printf( "SQL_BATCH_SUPPORT::SQL_BS_ROW_COUNT_EXPLICIT.. %d\n", nBatchSupport &
SQL_BS_ROW_COUNT_EXPLICIT );
+    printf( "SQL_BATCH_SUPPORT::SQL_BS_SELECT_PROC......... %d\n", nBatchSupport &
SQL_BS_SELECT_PROC );
+    printf( "SQL_BATCH_SUPPORT::SQL_BS_ROW_COUNT_PROC...... %d\n", nBatchSupport &
SQL_BS_ROW_COUNT_PROC );
+
+    if ( *szMultiResultSets != 'Y' )
+    {
+        printf( "[ERROR][%s][%s][%d] SQL_MULT_RESULT_SETS not supported.\n", __FILE__,
__FUNCTION__, __LINE__ );
+        goto mainExit1;
+    }
+
     nReturn = SQLAllocHandle( SQL_HANDLE_STMT, hDbc, &hStmt );
 
     /* do it */
@@ -251,14 +229,10 @@
         goto mainExit1;
     }
 
-    nReturn = doInsertData( hStmt );
+    nReturn = doBatchedCommands( hStmt );
     if ( !SQL_SUCCEEDED( nReturn ) )
         goto mainExit1;
 
-    nReturn = doSelectData( hStmt );
-    if ( !SQL_SUCCEEDED( nReturn ) )
-        goto mainExit1;
-
     nReturn = SQLExecDirect( hStmt, pszDropTable, SQL_NTS );
 
     printf( "[END][%s][%s][%d] SUCCESS\n", __FILE__, __FUNCTION__, __LINE__ );

Modified: trunk/Driver/examples/c/Batch1/qmake.pro
===================================================================
--- trunk/Driver/examples/c/Batch1/qmake.pro	2006-12-08 11:53:14 UTC (rev 719)
+++ trunk/Driver/examples/c/Batch1/qmake.pro	2006-12-08 13:01:24 UTC (rev 720)
@@ -8,7 +8,7 @@
 # COMMON
 # #########################################################
 TEMPLATE        = app
-TARGET          = BoundParameters2
+TARGET          = Batch1
 DESTDIR         = ./
 CONFIG          += console
 include( ../../../../common.pri )

Modified: trunk/Driver/examples/c/BoundParameters1/main.c
===================================================================
--- trunk/Driver/examples/c/BoundParameters1/main.c	2006-12-08 11:53:14 UTC (rev 719)
+++ trunk/Driver/examples/c/BoundParameters1/main.c	2006-12-08 13:01:24 UTC (rev 720)
@@ -128,8 +128,8 @@
 SQLRETURN doSelectData( SQLHSTMT hStmt )
 {
     SQLSMALLINT nID;
+    SQLINTEGER  nIDLen      = 0;
     SQLCHAR     szName[TABLE_DATA_COL_MAX + 1];
-    SQLINTEGER  nIDLen      = 0;
     SQLINTEGER  nNameLenInd = SQL_NTS;
     SQLRETURN   nReturn;
 

Thread
Connector/ODBC 5 commit: r720 - in trunk/Driver/examples/c: Batch1 BoundParameters1pharvey8 Dec