Skip to Content.
Sympa Menu

freetds - [freetds] ODBC: error 100 from SQLGetDiagRec?

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Craig Davison <cd AT securityfocus.com>
  • To: freetds AT lists.ibiblio.org
  • Subject: [freetds] ODBC: error 100 from SQLGetDiagRec?
  • Date: Fri, 24 Jan 2003 18:11:21 -0700

Hi,

I'm not all that familiar with ODBC but I think I've come across a problem
with the freetds ODBC driver.
Of course, the problem could be in my code or my ODBC driver (unixODBC 2.2.2).

I'm using freetds 0.60, and the DB server is MS SQLServer 2000.

When I run a query with SQLExecDirect or SQLExecute and it returns an error,
I can't seem to get any details about the error with SQLGetDiagRec - it
returns 100 (SQL_NO_DATA), and the error fields and error code are not
returned.
SQLGetDiagRec seems to work for an error from SQLConnect, however.

I've enclosed an example program that uses SQLExecDirect. It tries to SELECT
uid FROM master..sysusers (which should succeed) and then it tries to fail
with SELECT uid FRO master..sysusers (which should fail with an error
message, I would hope)

You'll need to edit the SQLConnect line in main() to run it.

--
Craig Davison
Symantec Corporation
+1 (403) 213-3939 ext. 228
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>

int test_query (SQLHDBC hOdbc, char *pQuery)
{
SQLHSTMT hStmt;
SQLINTEGER SQLerr, SQLuid;
SQLSMALLINT SQLmsglen;
char pStatus[10], pMsg[101];
long erg, erg2;

SQLAllocHandle(SQL_HANDLE_STMT, hOdbc, &hStmt);

SQLBindCol(hStmt, 1, SQL_C_SLONG, &SQLuid, sizeof(SQLINTEGER),
&SQLerr);

erg = SQLExecDirect(hStmt, pQuery, SQL_NTS);

if ((erg != SQL_SUCCESS) && (erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLExecDirect %ld\n",erg);
erg2 = SQLGetDiagRec(SQL_HANDLE_STMT, hStmt,1,
pStatus,&SQLerr,pMsg,100,&SQLmsglen);
if ((erg2 != SQL_SUCCESS) && (erg2 != SQL_SUCCESS_WITH_INFO))
{
printf("SQLGetDiagRec failed!! %ld\n", erg2);
SQLFreeHandle(SQL_HANDLE_STMT, &hStmt);
return -1;
}
printf("%s (%d)\n",pMsg,(int)SQLerr);
SQLFreeHandle(SQL_HANDLE_STMT, &hStmt);
return -1;
}

erg = SQLFetch(hStmt);
while (erg != SQL_NO_DATA)
{
printf ("uid: %d\n", (int)SQLuid);
erg = SQLFetch(hStmt);
}

SQLFreeStmt(hStmt, SQL_CLOSE);
SQLFreeHandle(SQL_HANDLE_STMT, &hStmt);

return 0;
}

int main ()
{
SQLHENV hEnv;
SQLHDBC hOdbc;
char pStatus[10], pMsg[101];
long erg;
SQLINTEGER SQLerr;
SQLSMALLINT SQLmsglen;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hOdbc);

erg = SQLConnect(hOdbc, (SQLCHAR*) "myserver", SQL_NTS,
(SQLCHAR*) "user", SQL_NTS,
(SQLCHAR*) "pass", SQL_NTS);

if ((erg != SQL_SUCCESS) && (erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %ld\n",erg);
SQLGetDiagRec(SQL_HANDLE_DBC, hOdbc,1,
pStatus,&SQLerr,pMsg,100,&SQLmsglen);
printf("%s (%d)\n",pMsg,(int)SQLerr);
SQLFreeHandle(SQL_HANDLE_DBC, &hOdbc);
SQLFreeHandle(SQL_HANDLE_ENV, &hEnv);
return 0;
}

printf ("******\n");
test_query (hOdbc, "SELECT uid FROM master..sysusers");
printf ("******\n");
test_query (hOdbc, "SELECT uid FRO master..sysusers");
printf ("******\n");
test_query (hOdbc, "SELECT uid FROM master..sysusers");

SQLDisconnect(hOdbc);
SQLFreeHandle(SQL_HANDLE_DBC, &hOdbc);
SQLFreeHandle(SQL_HANDLE_ENV, &hEnv);
return 0;
}




Archive powered by MHonArc 2.6.24.

Top of Page