title: C++ SQL Database program
body: <p>I have the following code that I wrote but it the SQLBindCol does not seem to work correctly (of course I could have screwed up the whole program too!.)  The connection works, it creates the table in the DB, addes the record fine and they all look good in SQL Enterprise Manager.  So what I need help with is after the comment "Part 3 &amp; 4: Searchs based on criteria."  Perhaps I should have done this assignment completely different or is this an acceptable method?</p>
  
  <pre><code>#include &lt;iostream&gt;
  #include &lt;cstdio&gt;
  #include &lt;string&gt;
  
  #include &lt;windows.h&gt;
  #include &lt;sql.h&gt;
  #include &lt;sqlext.h&gt;
  #include &lt;sqltypes.h&gt; 
  
  using namespace std;    // to save us having to type std::
  
  const int MAX_CHAR = 1024;
  
  int main ( )
  {
     SQLCHAR   SQLStmt[MAX_CHAR];
     char      strSQL[MAX_CHAR];
     char   chrTemp;
  
     SQLVARCHAR rtnFirstName[50];
     SQLVARCHAR rtnLastName[50];
     SQLVARCHAR rtnAddress[30];
     SQLVARCHAR rtnCity[30];
     SQLVARCHAR rtnState[3];
     SQLDOUBLE  rtnSalary;
     SQLVARCHAR rtnGender[1];
     SQLINTEGER rtnAge;
  
     // Get a handle to the database
  
     SQLHENV EnvironmentHandle;
     RETCODE retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &amp;EnvironmentHandle );
  
     // Set the SQL environment flags
  
     retcode = SQLSetEnvAttr( EnvironmentHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER );
  
     // create handle to the SQL database
  
     SQLHDBC ConnHandle;
     retcode = SQLAllocHandle( SQL_HANDLE_DBC, EnvironmentHandle, &amp;ConnHandle );
  
     // Open the database using a System DSN
  
     retcode = SQLDriverConnect(ConnHandle, 
     NULL, 
     (SQLCHAR*)"DSN=PRG411;UID=myUser;PWD=myPass;", 
     SQL_NTS,
     NULL, 
     SQL_NTS, 
     NULL, 
     SQL_DRIVER_NOPROMPT);
     if (!retcode) 
     {
        cout &lt;&lt; "SQLConnect() Failed";
     }
     else
     {
        // create a SQL Statement variable
  
        SQLHSTMT StatementHandle;
        retcode = SQLAllocHandle(SQL_HANDLE_STMT, ConnHandle, &amp;StatementHandle);
  
        // Part 1: Create the Employee table (Database)
  
        do
        {
           cout &lt;&lt; "Create the new table? ";
           cin &gt;&gt; chrTemp;
        } while (cin.fail());
  
        if (chrTemp == 'y' || chrTemp == 'Y')
        {
           strcpy((char *) SQLStmt, "CREATE TABLE [dbo].[Employee]([pkEmployeeID] [int] IDENTITY(1,1) NOT NULL,[FirstName] [varchar](50) NOT NULL,[LastName] [varchar](50) NOT NULL,[Address] [varchar](30) NOT NULL,[City] [varchar](30) NOT NULL,[State] [varchar](3) NOT NULL, [Salary] [double] NOT NULL,[Gender] [varchar](1) NOT NULL,  [Age] [int] NOT NULL, CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED ([pkEmployeeID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
        }
  
        // Part 2: Hardcode records into the table
  
        do
        {
           cout &lt;&lt; "Add records to the table? ";
           cin &gt;&gt; chrTemp;
        } while (cin.fail());
  
        if (chrTemp == 'y' || chrTemp == 'Y')
        {
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Mike','Slentz','123 Torrey Dr.','North Clairmont','CA', 48000.00 ,'M',34)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Sue','Vander Hayden','46 East West St.','San Diego','CA', 36000.00 ,'F',28)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Sharon','Stonewall','756 West Olive Garden Way','Plymouth','MA', 56000.00 ,'F',58)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('James','Bartholemew','777 Praying Way','Falls Church','VA', 51000.00 ,'M',45)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Joe','Smith','111 North 43rd Ave','Peoria','AZ', 44000.00 ,'M', 40)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Michael','Smith','20344 North Swan Park','Phoenix','AZ', 24000.00 ,'M', 40)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Jennifer','Jones','123 West North Ave','Flagstaff','AZ', 40000.00 ,'F', 40)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Cora','York','33rd Park Way Drive','Mayville','MI', 30000.00 ,'F', 61)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
           strcpy((char *) SQLStmt, "INSERT INTO employee([FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age]) VALUES ('Tom','Jefferson','234 Friendship Way','Battle Creek','MI', 41000.00 ,'M', 31)");
           retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
        }
  
        // Part 3 &amp; 4: Searchs based on criteria
  
        do
        {
           cout &lt;&lt; "1. Display all records in the database" &lt;&lt; endl;
           cout &lt;&lt; "2. Display all records with age greater than 40" &lt;&lt; endl;
           cout &lt;&lt; "3. Display all records with salary over $30K" &lt;&lt; endl;
           cout &lt;&lt; "4. Exit" &lt;&lt; endl &lt;&lt; endl;
  
           do
           {
              cout &lt;&lt; "Please enter a selection: ";
              cin &gt;&gt; chrTemp;
           } while (cin.fail());
  
           if (chrTemp == '1')
           {
              strcpy((char *) SQLStmt, "SELECT [FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age] FROM EMPLOYEE");
           }
           else if (chrTemp == '2')
           {
              strcpy((char *) SQLStmt, "SELECT [FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age] FROM EMPLOYEE WHERE [AGE] &gt; 40");
           }
           else if (chrTemp == '3')
           {
              strcpy((char *) SQLStmt, "SELECT [FirstName], [LastName], [Address], [City], [State], [Salary], [Gender],[Age] FROM EMPLOYEE WHERE [Salary] &gt; 30000");
           }
  
           if (chrTemp == '1'  || chrTemp == '2' || chrTemp == '3')
           {
              retcode = SQLExecDirect(StatementHandle, SQLStmt, SQL_NTS);
  
              SQLBindCol(StatementHandle, 1, SQL_C_CHAR, &amp;rtnFirstName, sizeof(rtnFirstName), NULL );
              SQLBindCol(StatementHandle, 2, SQL_C_CHAR, &amp;rtnLastName, sizeof(rtnLastName), NULL );
              SQLBindCol(StatementHandle, 3, SQL_C_CHAR, &amp;rtnAddress, sizeof(rtnAddress), NULL );
              SQLBindCol(StatementHandle, 4, SQL_C_CHAR, &amp;rtnCity, sizeof(rtnCity), NULL );
              SQLBindCol(StatementHandle, 5, SQL_C_CHAR, &amp;rtnState, sizeof(rtnState), NULL );
              SQLBindCol(StatementHandle, 6, SQL_C_DOUBLE, &amp;rtnSalary, sizeof(rtnSalary), NULL );
              SQLBindCol(StatementHandle, 7, SQL_C_CHAR, &amp;rtnGender, sizeof(rtnGender), NULL );
              SQLBindCol(StatementHandle, 8, SQL_C_NUMERIC, &amp;rtnAge, sizeof(rtnAge), NULL );
  
              for(;;) 
              {
                 retcode = SQLFetch(StatementHandle);
                 if (retcode == SQL_NO_DATA_FOUND) break;
  
                 cout &lt;&lt; rtnFirstName &lt;&lt; " " &lt;&lt; rtnLastName &lt;&lt; " " &lt;&lt; rtnAddress &lt;&lt; " " &lt;&lt; rtnCity &lt;&lt; " " &lt;&lt; rtnState &lt;&lt; " " &lt;&lt; rtnSalary &lt;&lt; " " &lt;&lt; rtnGender &lt;&lt; "" &lt;&lt; rtnAge &lt;&lt; endl;
              }
           }
        } while (chrTemp != '4');
  
        SQLFreeStmt(StatementHandle, SQL_CLOSE );
        SQLFreeConnect(ConnHandle);
        SQLFreeEnv(EnvironmentHandle);
  
        printf( "Done.\n" );
     }
  
     return 0;
  }
  </code></pre>