I am trying to compile the following code. I keep getting thefollowing linker errors. I am getting about 28n of these errors all having the linker at the begining

[Linker error] undefined reference to `SQLGetDiagField@28'
[Linker error] undefined reference to `SQLGetDiagRec@32'

#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>

void print_error( SQLSMALLINT htype,      /* A handle type identifier */
                       SQLHANDLE   hndl,  /* A handle */
                       SQLRETURN   frc,   /* Return code to be included with error msg  */
                       int         line,  /* Used for output message, indcate where     */
                       char *      file   /* the error was reported from  */
                     ) {

    SQLCHAR     buffer[SQL_MAX_MESSAGE_LENGTH + 1] ;
    SQLCHAR     sqlstate[SQL_SQLSTATE_SIZE + 1] ;
    SQLINTEGER  sqlcode ;
    SQLSMALLINT length, i ;
    SQLINTEGER NumRecords;

    printf( ">--- ERROR -- RC = %d Reported from %s, line %d ------------\n",
            frc,
            file,
            line
          ) ;
    SQLGetDiagField(htype, hndl, 0,SQL_DIAG_NUMBER, &NumRecords, SQL_IS_INTEGER,NULL);
    printf("Total Number of diagnostic records: %d\n",NumRecords); 
    i = 1 ;
    while ( SQLGetDiagRec( htype,
                           hndl,
                           i,
                           sqlstate,
                           &sqlcode,
                           buffer,
                           SQL_MAX_MESSAGE_LENGTH + 1,
                           &length
                         ) == SQL_SUCCESS ) {
       printf( "         SQLSTATE: %s\n", sqlstate ) ;
       printf( "Native Error Code: %ld\n", sqlcode ) ;
       printf( "%s \n", buffer ) ;
       i++ ;
    }

    printf( ">--------------------------------------------------\n" ) ;
}

int main()
{
    // Declare The Local Memory Variables
    SQLHANDLE EnvHandle = 0;
    SQLHANDLE ConHandle = 0;
    SQLHANDLE StmtHandle = 0;
    SQLRETURN RetCode = SQL_SUCCESS;
    SQLCHAR SQLStmt[255];
    SQLCHAR JobType[10];
    SQLCHAR EmpNo[10];
    SQLCHAR LastName[25];
    SQLCHAR FirstName[15];
    int EmpId=1002;
    
    /**
     * INITIALIZATION 
     **/
    // Allocate An Environment Handle
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&EnvHandle);

    // Set The ODBC Application Version To 3.x
    printf("Setting the ODBC version... \n");

    if (EnvHandle != 0)
        SQLSetEnvAttr(EnvHandle, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, 
                SQL_IS_UINTEGER);

    // Allocate A Connection Handle
    printf("Creating Connection handle... \n");

    if (EnvHandle != 0)
        SQLAllocHandle(SQL_HANDLE_DBC, EnvHandle,&ConHandle);

    // Connect To The Appropriate Data Source

    if (ConHandle != 0)
    {
        RetCode = SQLConnect(ConHandle, (SQLCHAR *) "SAMPLE",SQL_NTS,
                          (SQLCHAR *) "app",SQL_NTS, 
              (SQLCHAR *) "app",    SQL_NTS);
        printf("Got the connection... \n");
    }

    /*
     * TRANSACTION PROCESSING 
     **/

    // Allocate An SQL Statement Handle
    if (ConHandle != 0 && RetCode == SQL_SUCCESS)
        SQLAllocHandle(SQL_HANDLE_STMT, ConHandle,&StmtHandle);
    else{
        printf("Error getting connection:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_DBC,ConHandle,
                             RetCode,__LINE__,__FILE__ );
        return(0);
    }
    // Define A SELECT SQL Statement That Uses A Parameter
    

    strcpy((char *) SQLStmt, "INSERT INTO EMPLOYEE VALUES (?,?,?,?, \
               CURRENT DATE)");    
    RetCode = SQLPrepare(StmtHandle, SQLStmt, SQL_NTS);
    if(RetCode!=SQL_SUCCESS)
    {
        printf("Error preparing the insert statement:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }
    RetCode = SQLBindParameter(StmtHandle, 1,SQL_PARAM_INPUT, SQL_C_LONG, 
                  SQL_INTEGER,sizeof(EmpId), 
          0, &EmpId ,sizeof(EmpId), NULL);
    if(RetCode!=SQL_SUCCESS)
    {
        printf("Error binding the first param in insert:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }
    RetCode = SQLBindParameter(StmtHandle, 2,SQL_PARAM_INPUT, SQL_C_CHAR, 
                  SQL_CHAR,sizeof(FirstName), 
          0, FirstName,sizeof(FirstName), NULL);
    if(RetCode!=SQL_SUCCESS)
    {
        printf("Error binding the second param in insert:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }
    
    RetCode = SQLBindParameter(StmtHandle, 3,SQL_PARAM_INPUT, SQL_C_CHAR, 
                  SQL_CHAR,sizeof(LastName), 
              0, LastName,sizeof(LastName), NULL);
    if(RetCode!=SQL_SUCCESS)
    {
        printf("Error binding the third param in insert:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }
    
    RetCode = SQLBindParameter(StmtHandle, 4,SQL_PARAM_INPUT, SQL_C_CHAR, 
                  SQL_CHAR,sizeof(JobType), 
          0, JobType,sizeof(JobType), NULL);
    if(RetCode!=SQL_SUCCESS)
    {
        printf("Error binding the fourth param in insert:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }
    strcpy((char *) FirstName, "Robert");
    strcpy((char *) LastName, "Evans");
    strcpy((char *) JobType, "ENGINEER");


    RetCode = SQLExecute(StmtHandle);
    if (RetCode == SQL_SUCCESS)
    {
        printf("Successfully executed the insert statement...\n");
    }
    else
    {
        printf("Error executing insert statement:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }

    // A  SELECT Statement

    strcpy((char *) SQLStmt, "SELECT EMPNO, LASTNAME FROM ");
    strcat((char *) SQLStmt, "EMPLOYEE WHERE JOBTYPE = ?");

    // Prepare The SQL Statement

    RetCode = SQLPrepare(StmtHandle, SQLStmt, SQL_NTS);
    if(RetCode!=SQL_SUCCESS)
    {
        printf("Error preparing:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }

    // Bind The Parameter Marker Used In The SQL Statement To
    // An Application Variable

    RetCode = SQLBindParameter(StmtHandle, 1,SQL_PARAM_INPUT, SQL_C_CHAR, 
                  SQL_CHAR,sizeof(JobType), 
              0, JobType,sizeof(JobType), NULL);
    if(RetCode!=SQL_SUCCESS)
    {
        printf("Error binding:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }
    // Populate The "Bound" Application Variable

    strcpy((char *) JobType, "ENGINEER");
    // Execute The SQL Statement

    RetCode = SQLExecute(StmtHandle);
    // If The SQL Statement Executed Successfully, Retrieve
    // The Results

    if (RetCode == SQL_SUCCESS)
    {
        printf("Successfully executed the select statement...\n");
    
        // Bind The Columns In The Result Data Set Returned
        // To Application Variables
    
        SQLBindCol(StmtHandle, 1, SQL_C_CHAR, (SQLPOINTER)EmpNo, 
                sizeof(EmpNo), NULL);

        SQLBindCol(StmtHandle, 2, SQL_C_CHAR, (SQLPOINTER)
        LastName, sizeof(LastName), NULL);
    
        // While There Are Records In The Result Data Set
        // Produced, Retrieve And Display Them
    
        while (RetCode != SQL_NO_DATA)
        {
            RetCode = SQLFetch(StmtHandle);
            if (RetCode != SQL_NO_DATA)
                printf("%-8s %s\n", EmpNo, LastName);
        }
    }else
    {
        printf("Error executing select statement:\n");
        print_error((SQLSMALLINT)SQL_HANDLE_STMT,StmtHandle,
                             RetCode,__LINE__,__FILE__ );
    }
    // Commit The Transaction
    RetCode = SQLEndTran(SQL_HANDLE_DBC, ConHandle,SQL_COMMIT);
    
    /**
     * TERMINATION 
     **/
     
    // Free The SQL Statement Handle 
    if (StmtHandle != 0)
    SQLFreeHandle(SQL_HANDLE_STMT, StmtHandle);


    // Terminate The Data Source Connection
    if (ConHandle != 0)
    RetCode = SQLDisconnect(ConHandle);

    // Free The Connection Handle
    if (ConHandle != 0)
    SQLFreeHandle(SQL_HANDLE_DBC, ConHandle);

    // Free The Environment Handle
    if (EnvHandle != 0)
    SQLFreeHandle(SQL_HANDLE_ENV, EnvHandle);

    // Return Control To The OS
    return(0);
}

Recommended Answers

All 2 Replies

Member Avatar for iamthwee

So have you linked the header files then?

In the project settings have you set the path for the header and library files of your SQL library ?

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.