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 BoundParameters1 | pharvey | 8 Dec |