Index: tol/dbdrivers/libtolodbc.c
===================================================================
--- tol/dbdrivers/libtolodbc.c	(revision 2ea9c89b239409f3593d9b4ac1eb23fd4484e01f)
+++ tol/dbdrivers/libtolodbc.c	(revision cb423227bec41cd097cd3951c655785bad25548b)
@@ -61,4 +61,35 @@
 #define TRACE_DEEP 1
 
+#ifdef _MSC_VER
+
+#define snprintf c99_snprintf
+
+int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap)
+{
+    int count = -1;
+
+    if (size != 0)
+        count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);
+    if (count == -1)
+        count = _vscprintf(format, ap);
+
+    return count;
+}
+
+int c99_snprintf(char* str, size_t size, const char* format, ...)
+{
+    int count;
+    va_list ap;
+
+    va_start(ap, format);
+    count = c99_vsnprintf(str, size, format, ap);
+    va_end(ap);
+
+    return count;
+}
+
+#endif // _MSC_VER
+
+
 typedef struct odbcdx {
   //  char *alias;
@@ -85,5 +116,5 @@
     SQLSMALLINT type)
 {
-    SQLINTEGER   i = 0;
+    SQLSMALLINT   i = 0;
     SQLINTEGER   native;
     SQLCHAR      state[ 7 ];
@@ -523,5 +554,6 @@
   TOLSQL_BIGINT _bigint;       // for SQL_BIGINT
   SQLINTEGER _integer;         // for SQL_INTEGER
-  SQLCHAR *_decimal;           // for SQL_DECIMAL SQL_NUMERIC
+  //SQLCHAR *_decimal;           // for SQL_DECIMAL SQL_NUMERIC
+  SQLCHAR   szNumeric[256];    // for SQL_DECIMAL SQL_NUMERIC SQL_BIGINT
   SQLDOUBLE _double;           // for SQL_DOUBLE, SQL_FLOAT
   SQLREAL _real;               // for SQL_REAL
@@ -531,5 +563,5 @@
   SQLINTEGER pcbValue;
   int size;
-  char *errmsg;
+  char szErrMsg[256];
   SQLSMALLINT targetType = SQL_C_DEFAULT;
   SQLSMALLINT type = dbd->typeList[nfield];
@@ -547,13 +579,17 @@
       size=sizeof(SQLSMALLINT); pointer=&_smallint; 
       break;
+/*
     case SQL_BIGINT:
+printf( "case SQL_BIGINT:\n" );
+
       size=sizeof(TOLSQL_BIGINT); pointer=&_bigint; 
       targetType = SQL_C_SBIGINT;
       break;
+*/
     case SQL_INTEGER:
       size=sizeof(SQLINTEGER); pointer=&_integer; 
       break;
-    case SQL_DECIMAL: case SQL_NUMERIC:
-      size=64; 
+    case SQL_DECIMAL: case SQL_NUMERIC: case SQL_BIGINT:
+      /*size=64; 
       _decimal=(SQLCHAR *)calloc(size, sizeof(SQLCHAR)); 
       if(_decimal==NULL) { 
@@ -561,5 +597,8 @@
 	return 0; 
       }
-      pointer=_decimal;
+      pointer=_decimal;*/
+      pointer = (SQLPOINTER)szNumeric;
+      size = sizeof( szNumeric );
+      targetType = SQL_C_CHAR;
       break;
     case SQL_DOUBLE: case SQL_FLOAT:
@@ -570,16 +609,13 @@
       break;
     default:
-      errmsg = (char *)calloc(45, sizeof(char));
-      if(errmsg==NULL) {
-	stdOutWriter("Out of memory\n");
-      } else {
-	sprintf(errmsg, "Wrong numeric data type at SQL field:%i\n", nfield+1);
-	stdOutWriter(errmsg);
-      }
+      snprintf( szErrMsg, sizeof( szErrMsg ) - 1,
+                "Wrong numeric data type at SQL field: %i\n", nfield + 1 );
+      stdOutWriter( szErrMsg );
       return 0;
     }
 
   // retrieve data from DDBB
-  status = SQLGetData(dbd->hstmt, nfield+1, targetType, pointer, size, &pcbValue);
+  status = SQLGetData( dbd->hstmt, nfield+1, targetType, pointer, size,
+                       &pcbValue );
   if(!checkSQLRet(status, dbd, __LINE__, GET_DIAG_STMT)) { return 0; }
 
@@ -598,10 +634,12 @@
     case SQL_SMALLINT:
       *realval = (long double)(_smallint); break;
+    /*
     case SQL_BIGINT:
-      *realval = (long double)_bigint; break;
+      *realval = (long double)_bigint; break; */
     case SQL_INTEGER:
       *realval = (long double)(_integer); break;
-    case SQL_DECIMAL: case SQL_NUMERIC:
-      sscanf((char *)_decimal, "%Lf", realval); break;
+    case SQL_DECIMAL: case SQL_NUMERIC: case SQL_BIGINT:
+      //sscanf((char *)_decimal, "%Lf", realval); break;
+      sscanf( szNumeric, "%Lf", realval); break;
     case SQL_DOUBLE: case SQL_FLOAT:
       *realval = (long double)(_double); break;
