Executing a query

If you want to execute a query you will need to specify a handle (SQL_HANDLE_STMT) for a SQL-statement. In order to get one you have to allocate one with SQLAllocHandle.

Then you have to think about the SQL statement you want to execute. As I mentioned in the introduction I assume that we have a table tkeyuser which contains the following data:

iduser dtname dtmaxSize
1 Christa 10000
2 Nicole 9000

In this example, we want to execute a query which returns all the rows for the fields iduser and dtname in this table ordered by iduser. So the SQL statement would be:

SELECT iduser,dtname FROM tkeydata ORDER BY iduser

If you execute this statement you would get two rows each with two columns of data. This data has to be stored somewhere so that your programm can actually use it, so you need to define a variable for each of the columns. So you need to bind a column to variable in your program. Binding a variable automatically stores the data of the column in the variable when you retrieve a result row from the connection. It is important that your variables match the type of the column in the table within the database.

So we need to bin column #1 to a variable of type SQLINTEGER and the second column to a variable of type char. This is done by SQLBindCol. Therefore we add the variables:

SQLHSTMT V_OD_hstmt;   // Handle for a statement
SQLINTEGER V_OD_err,V_OD_id;
char V_OD_buffer[200];

Now we can bind the variables:

SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,200,&V_OD_err);
SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,sizeof(V_OD_id),&V_OD_err);

Yes you should check for the return code of the function call. I'm to lazy to code it here once again :(

Now we can execute the query by calling SQLExecDirect:

 V_OD_erg=SQLExecDirect(V_OD_hstmt,
             "SELECT dtname,iduser FROM tkeyuser order by iduser",SQL_NTS);
 if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
     printf("Error Select %d\n",V_OD_erg);
     SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat, &V_OD_err,
	               V_OD_msg,100,&V_OD_mlen);
     printf("%s (%d)\n",V_OD_msg,V_OD_err);
     SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
     SQLDisconnect(V_OD_hdbc);
     SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
     SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
     exit(0);
    }