VC连接数据库的问题
用ODBC连同数据库后,想取出表中的数据,该用什么方法??
[解决办法]
#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