MFC编程 sql 5
现在要做数据库大作业,谁可以用MFC帮我做一个应用程序,我把分数全给他,需求分析,E-R图等我已做好,就是不会开发应用平台,最好是用ODBC连接SQLSERVER。如果嫌...
现在要做数据库大作业,谁可以用MFC帮我做一个应用程序,我把分数全给他,需求分析,E-R图等我已做好,就是不会开发应用平台,最好是用ODBC连接SQL SERVER。如果嫌烦可以告诉我怎么做也行,我懂一点对话框编程,就是不会通过控件操作数据库。
急啊////////////////// 展开
急啊////////////////// 展开
2个回答
展开全部
可以使用mfc类中的数据库类结合listcontrol控件完成。listcontrol控件用于查询记录集的显示。
数据库类包括CDatabase(数据库类),CRecordSet(记录集类)和CRecordView(可视记录集类)。 其中: CDatabase类对象提供了对数据源的连接,对数据源进行操作。 CRecordView类对象能以控制的形式 显示数据库记录。这个视图是直接连到一个CRecordSet对象的表视图。 CRecordSet类对象提供了从数据源 中提取出的记录集。
首先应用AppWizard来建立一个ODBC的应用程序框架,注意应包括头文件afxdb.h。 其中两个最重要的类是CDatabase和CRecordSet。下面说一下数据库操作的方法,以SQL为例:
方法一:查询记录使用CRecordSet::Open()和 CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用 CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery()函数。
方法二:通 过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行: 如下代码所示 BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL) { TRY { m_pdb->ExecuteSQL(strSQL); //直接执行SQL语句 } CATCH (CDBException,e) { CString strMsg; strMsg.LoadString(IDS_EXECUTE_SQL_FAILED); strMsg+=strSQL; return FALSE; } END_CATCH return TRUE; }
其中,方法一仅提供查询记录的功能;方法二直接对数据库进行操作,可以进行查询、修改、删除、添加记录等一系列功能,具有更强的灵活性,但在使用时需要谨慎。
再说一下listcontrol控件的使用:
它主要用于数据的显示。关键用到的函数是InsertColumn()和SetItemText()函数,您可以参照mfc类帮助文件。
数据库类包括CDatabase(数据库类),CRecordSet(记录集类)和CRecordView(可视记录集类)。 其中: CDatabase类对象提供了对数据源的连接,对数据源进行操作。 CRecordView类对象能以控制的形式 显示数据库记录。这个视图是直接连到一个CRecordSet对象的表视图。 CRecordSet类对象提供了从数据源 中提取出的记录集。
首先应用AppWizard来建立一个ODBC的应用程序框架,注意应包括头文件afxdb.h。 其中两个最重要的类是CDatabase和CRecordSet。下面说一下数据库操作的方法,以SQL为例:
方法一:查询记录使用CRecordSet::Open()和 CRecordSet::Requery()成员函数。在使用CRecordSet类对象之前,必须使用 CRecordSet::Open()函数来获得有效的记录集。一旦已经使用过CRecordSet::Open() 函数,再次查询时就可以应用CRecordSet::Requery()函数。
方法二:通 过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行: 如下代码所示 BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL) { TRY { m_pdb->ExecuteSQL(strSQL); //直接执行SQL语句 } CATCH (CDBException,e) { CString strMsg; strMsg.LoadString(IDS_EXECUTE_SQL_FAILED); strMsg+=strSQL; return FALSE; } END_CATCH return TRUE; }
其中,方法一仅提供查询记录的功能;方法二直接对数据库进行操作,可以进行查询、修改、删除、添加记录等一系列功能,具有更强的灵活性,但在使用时需要谨慎。
再说一下listcontrol控件的使用:
它主要用于数据的显示。关键用到的函数是InsertColumn()和SetItemText()函数,您可以参照mfc类帮助文件。
展开全部
以下代码直接兼容windows+odbc+sql server,以及linux+mysql,直接调用函数皆可,不需要通过控件,不需要使用MFC
#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
#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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询