VC连接数据库的有关问题

VC连接数据库的问题
用ODBC连同数据库后,想取出表中的数据,该用什么方法??

------解决方案--------------------
C/C++ code

#ifdef WIN32
#include <windows.h>
#include <odbcinst.h>
#include <sqlext.h>
#else
#include <mysql.h>
#include <unistd.h>
#define SQLHANDLE static MYSQL
#endif
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

SQLHANDLE hDBEnv, hDBC;

int DB_Open(char * dbcn, char * usr, char * pwd)
{
 int r;
 #ifdef WIN32
  r = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hDBEnv);
  if(r) return 0;
  r = SQLSetEnvAttr(hDBEnv,SQL_ATTR_ODBC_VERSION,
    (void*)SQL_OV_ODBC3,0); 
  if(r) return 0;
  r = SQLAllocHandle(SQL_HANDLE_DBC, hDBEnv, &hDBC);
  if(r) return 0;
  r = SQLConnect(hDBC, 
   (unsigned char *)dbcn, strlen(dbcn), 
   (unsigned char *)usr,  strlen(usr), 
   (unsigned char *)pwd,  strlen(pwd));
  return r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO;
 #else
  mysql_init(&hDBC);
  MYSQL * rx = mysql_real_connect(
    &hDBC, dbcn, usr, pwd, NULL, 0, NULL, 0);
  if(!rx) return 0;
  return 1;
 #endif
}//end DB_Open

int DB_Exec(char * sql)
{
 #ifdef WIN32 
  SQLHANDLE hStatement = NULL;
  SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
  SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
  SQLCloseCursor(hStatement);
  SQLFreeHandle(SQL_HANDLE_STMT, hStatement);
  hStatement = NULL;
 #else
  mysql_real_query (&hDBC, sql, strlen(sql));
 #endif
 return 1;
}//end DB_Exec

int DB_Close(void)
{
 #ifdef WIN32
  SQLDisconnect(hDBC);
  SQLFreeHandle(SQL_HANDLE_DBC, hDBC);
  SQLFreeHandle(SQL_HANDLE_ENV, hDBEnv);
 #else
  mysql_close(&hDBC);
 #endif
 return 1;
}//DB_Close()

#ifndef WIN32
typedef struct tagMySQLRecordset {
 MYSQL_RES * hRecord;
 void * * row;
 int * size;
 int cols;
} MYSQLRecordset;

#endif

void DB_CleanQuery(void *hRecordset)
{
 if(!hRecordset) return;
 #ifdef WIN32
 __try {
  SQLCloseCursor(hRecordset);
  SQLFreeHandle(SQL_HANDLE_STMT, hRecordset);
  hRecordset = NULL;
 }__finally{
  return;
 }//end try
 #else
  MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
  mysql_free_result (hRec->hRecord);
  free(hRec->row);  hRec->row = NULL;
  free(hRec->size); hRec->size = NULL;
  free(hRec); hRec = NULL;
 #endif
}//end DB_CleanQuery

int DB_Next(void * hRecordset) 
{
 int r=0; if(!hRecordset) return 0;
 #ifdef WIN32
  r = SQLFetch(hRecordset);
  r = r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
  if(!r) {
   DB_CleanQuery(hRecordset);
  }//end if
 #else
  MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
  MYSQL_ROW row = mysql_fetch_row (hRec->hRecord);
  if(row) {
   for(int i=0; i<hRec->cols; i++) {
    memcpy(hRec->row[i], row[i], hRec->size[i]);
   }//next i
   r = 1;
  }else{
   DB_CleanQuery(hRecordset);
   r = 0;
  }//end if
 #endif
 return r;
}//end DB_Next

int DB_params_count(const char * fmt)
{
 int i=0, j=0;
 while(fmt[i]) {
  if(fmt[i]=='%') j++;
  i++;
 }//end while
 return j;
}//end DB_params_count

void * DB_Query(char *sql, const char *fmt, ...)
{
 int r=0;
 int cols = DB_params_count(fmt);
 if(cols<1) return NULL;
 #ifdef WIN32
  SQLHANDLE hStatement = NULL;
  SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
  r = SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
  r = r==SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
  if(!r) {
   return NULL;
  }//end if
 #else
  r = mysql_real_query (&hDBC, sql, strlen(sql));
  if(r) return NULL;
  MYSQL_RES * rec = NULL;
  rec = mysql_store_result (&hDBC);
  if(!rec) return NULL;
  MYSQLRecordset * hStatement 
   = (MYSQLRecordset *)malloc(sizeof(MYSQLRecordset));
  if(!hStatement) return NULL;
  memset(hStatement, 0, sizeof(MYSQLRecordset));
  hStatement->hRecord = rec;
  hStatement->cols = cols;
  hStatement->row = (void **)malloc(cols * sizeof(void *));
  memset(hStatement->row, 0, cols * sizeof(void *));
  hStatement->size = (int *)malloc(cols * sizeof(int));
  memset(hStatement->size, 0, cols * sizeof(int));
 #endif
 va_list ap; va_start(ap, fmt);
 void * var; char buf[32];
 int i=0,j=0,k=0,sz=0; char c=0; 
 int len = strlen(fmt); int bad=1;
 #ifdef WIN32 
  int col=1;
 #else
  int col=0;
 #endif
 while(fmt[i]) {
  c = fmt[i++]; 
  if(c != '%') continue;
  c = fmt[i++]; 
  var = va_arg(ap, void *);
  if(c == 'd') {
   #ifdef WIN32
   SQLBindCol(hStatement, col, SQL_C_SLONG, var, 4,NULL);
   #else
   hStatement->row[col] = var;
   hStatement->size[col] = sizeof(long);
   #endif
   col++;
   continue;
  }//end if
  if(c == 'f') {
   #ifdef WIN32
   SQLBindCol(hStatement, col, SQL_C_FLOAT, var, 4,NULL);
   #else
   hStatement->row[col] = var;
   hStatement->size[col] = sizeof(float);
   #endif
   col++;
   continue;
  }//end if
  memset(buf, 0, 32); bad=1;
  for(j=i-1; j<len; j++) {
   c = fmt[j];
   if(c>='0' && c<='9') buf[j-i+1]=c;
   if(c=='s') {bad=0; k=j+1; break;}
  }//next j
  if(bad) return NULL;
  sscanf(buf, "%d", &sz);
  #ifdef WIN32
   SQLBindCol(hStatement, col, SQL_C_CHAR, var, sz, NULL);
  #else
   hStatement->row[col] = var;
   hStatement->size[col] = sz;
  #endif
  col++;
  i = k;
    }//end while
    va_end(ap);
 return hStatement;
}//end DB_Rec