读书人

VC连接数据库的有关问题

发布时间: 2012-05-03 14:06:56 作者: rapoo

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_Openint 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_Execint 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 WIN32typedef struct tagMySQLRecordset { MYSQL_RES * hRecord; void * * row; int * size; int cols;} MYSQLRecordset;#endifvoid 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_CleanQueryint 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_Nextint 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_countvoid * 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 

读书人网 >C++

热点推荐