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