ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
来源:互联网 发布:淘宝充话费上钻 编辑:程序博客网 时间:2024/05/16 06:41
ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
.
/////////////////////////////////////////////////////////////
// datadase odbc1.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "datadase odbc1.h"
#include "resource.h"
#include "string.h"
#include "sql.h"
#include "sqlext.h"
#include "sqltypes.h"
void Save(HWND hwnd);
void Login(HWND hwnd);
#define LOGIN_TIMEOUT 30
#define MAXBUFLEN 255
#define CHECKDBSTMTERROR(hwnd,result,hstmt) if(SQL_ERROR==result){ShowDBStmtError(hwnd,hstmt);return;}
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
HWND ghdlg;
// 此代码模块中包含的函数的前向声明:
INT_PTR CALLBACK About1(HWND, UINT, WPARAM, LPARAM);
void DBTest(HWND hwnd);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, About1);
return 0;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
void ShowDBError(HWND hwnd,SQLSMALLINT type,SQLHANDLE sqlHandle)
{
WCHAR pStatus[10], pMsg[101];
SQLSMALLINT SQLmsglen;
TCHAR error[200] = {0};
SQLINTEGER SQLerr;
long erg2 = SQLGetDiagRec(type, sqlHandle,1,(SQLWCHAR *)pStatus,&SQLerr,(SQLWCHAR*)pMsg,100,&SQLmsglen);
wsprintf(error,L"%s (%d)\n",pMsg,(int)SQLerr);
MessageBox(hwnd,error,TEXT("数据库执行错误"),MB_ICONERROR|MB_OK);
}
void ShowDBConnError(HWND hwnd,SQLHDBC hdbc)
{
ShowDBError(hwnd,SQL_HANDLE_DBC,hdbc);
}
void ShowDBStmtError(HWND hwnd,SQLHSTMT hstmt)
{
ShowDBError(hwnd,SQL_HANDLE_STMT,hstmt);
}
INT_PTR CALLBACK About1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
ghdlg=hDlg;
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
switch(LOWORD(wParam))
{
case IDC_BUTTON2://保存
{
Save(hDlg);
break;
}
case IDC_BUTTON1://确认登陆
{
Login(hDlg);
break;
}
default:break;
}
}
}
return (INT_PTR)FALSE;
}
void Save(HWND hwnd)
{
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN result;
SQLWCHAR ConnStrIn[MAXBUFLEN] = L"DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=database2;CharSet=gb2312;";
SQLWCHAR ConnStrOut[MAXBUFLEN];
//分配环境句柄
result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,
&henv);
//设置管理环境属性
result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);
//分配连接句柄
result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,
(void*)LOGIN_TIMEOUT, 0);
//连接数据库
result = SQLDriverConnect(hdbc,NULL,ConnStrIn,SQL_NTS,ConnStrOut,MAXBUFLEN,(SQLSMALLINT*)0,SQL_DRIVER_NOPROMPT);
if(SQL_ERROR==result)
{
ShowDBConnError(hwnd,hdbc);
return;
}
//初始化语句句柄
result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//SQL_NTS telling the function the previous parameter is NullTerminated String,
//please alculate the string length for me
SQLWCHAR username[256];
SQLWCHAR password[256];
GetDlgItemText(hwnd,IDC_EDIT1,username,sizeof(username)/sizeof(SQLWCHAR));
GetDlgItemText(hwnd,IDC_EDIT2,password,sizeof(password)/sizeof(SQLWCHAR));
SQLWCHAR sql[256];
wsprintf(sql,TEXT("insert into t_user1(FUserName,FPassWord) values('%s','%s')"),username,password);
if (*username==NULL ||*password==NULL)
{
MessageBox(hwnd,TEXT("有户名或密码不为空!"),TEXT("注册"),MB_OK|MB_ICONERROR);
return;
}
result = SQLPrepare(hstmt,(SQLWCHAR*)sql,SQL_NTS);
CHECKDBSTMTERROR(hwnd,result,hstmt);
result =SQLExecute(hstmt);
CHECKDBSTMTERROR(hwnd,result,hstmt);
SQLFreeStmt(hstmt,SQL_CLOSE);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
MessageBox(hwnd,TEXT("保存成功"),TEXT("注册"),MB_OK|MB_ICONINFORMATION);
SetDlgItemText(hwnd,IDC_EDIT1,NULL);
SetDlgItemText(hwnd,IDC_EDIT2,NULL);
}
void Login(HWND hwnd)
{
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN result;
SQLWCHAR ConnStrIn[MAXBUFLEN] = L"DRIVER={MySQL ODBC 5.1 Driver};SERVER={127.0.0.1};UID=root;PWD=root;DATABASE=database2;CharSet=GBK;";
SQLWCHAR ConnStrOut[MAXBUFLEN];
//分配环境句柄
result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,
&henv);
//设置管理环境属性
result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);
//分配连接句柄
result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,
(void*)LOGIN_TIMEOUT, 0);
//连接数据库
result = SQLDriverConnect(hdbc,NULL,ConnStrIn,SQL_NTS,ConnStrOut,MAXBUFLEN,(SQLSMALLINT*)0,SQL_DRIVER_NOPROMPT);
if(SQL_ERROR==result)
{
ShowDBConnError(hwnd,hdbc);
return;
}
//初始化语句句柄
result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//SQL_NTS telling the function the previous parameter is NullTerminated String,
//please alculate the string length for me
result = SQLPrepare(hstmt,(SQLWCHAR*)L"select FUserName,FPassWord from t_user1",SQL_NTS);
CHECKDBSTMTERROR(hwnd,result,hstmt);
result =SQLExecute(hstmt);
CHECKDBSTMTERROR(hwnd,result,hstmt);
SQLINTEGER cbsatid=SQL_NTS;
SQLWCHAR Inputusername[20];
SQLWCHAR Inputpassword[20];
GetDlgItemText(hwnd,IDC_EDIT3,Inputusername,30);
GetDlgItemText(hwnd,IDC_EDIT4,Inputpassword,30);
int found=1;
while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)
{
SQLWCHAR username[20];
SQLGetData(hstmt,1,SQL_C_WCHAR,username,30,&cbsatid);
SQLWCHAR password[20];
SQLGetData(hstmt,2,SQL_C_WCHAR,password,30,&cbsatid);
if (lstrcmpW(Inputpassword,password)==0)
{
if (lstrcmpW(Inputusername,username)==0)
{
MessageBox(hwnd,TEXT("登陆成功"),TEXT("login"),MB_OK|MB_ICONINFORMATION);
SetDlgItemText(hwnd,IDC_EDIT4,NULL);
found=0;
break;
}
}
}
if (1==found)
{
MessageBox(hwnd,TEXT("登陆失败"),TEXT("login"),MB_OK|MB_ICONERROR);
}
SQLFreeStmt(hstmt,SQL_CLOSE);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
}
定义Save, Login两个函数,传入参数为句柄;
VC++的程序,入口点为_tWinMain();
ShowDBError函数,接收SQLSMALLINT和SQLHANDLE类型参数,显示数据库执行错误;
SQLHENV, 环境句柄;
SQLHDBC,连接句柄;
SQLHSTMT,语句句柄;
分配句柄,然后调用SQLDriverConnect连接数据库;
分配语句句柄,准备语句,然后执行;
SQLFetch()函数在结果集中检索下一行元组;
.
/////////////////////////////////////////////////////////////
// datadase odbc1.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "datadase odbc1.h"
#include "resource.h"
#include "string.h"
#include "sql.h"
#include "sqlext.h"
#include "sqltypes.h"
void Save(HWND hwnd);
void Login(HWND hwnd);
#define LOGIN_TIMEOUT 30
#define MAXBUFLEN 255
#define CHECKDBSTMTERROR(hwnd,result,hstmt) if(SQL_ERROR==result){ShowDBStmtError(hwnd,hstmt);return;}
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
HWND ghdlg;
// 此代码模块中包含的函数的前向声明:
INT_PTR CALLBACK About1(HWND, UINT, WPARAM, LPARAM);
void DBTest(HWND hwnd);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, About1);
return 0;
}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
void ShowDBError(HWND hwnd,SQLSMALLINT type,SQLHANDLE sqlHandle)
{
WCHAR pStatus[10], pMsg[101];
SQLSMALLINT SQLmsglen;
TCHAR error[200] = {0};
SQLINTEGER SQLerr;
long erg2 = SQLGetDiagRec(type, sqlHandle,1,(SQLWCHAR *)pStatus,&SQLerr,(SQLWCHAR*)pMsg,100,&SQLmsglen);
wsprintf(error,L"%s (%d)\n",pMsg,(int)SQLerr);
MessageBox(hwnd,error,TEXT("数据库执行错误"),MB_ICONERROR|MB_OK);
}
void ShowDBConnError(HWND hwnd,SQLHDBC hdbc)
{
ShowDBError(hwnd,SQL_HANDLE_DBC,hdbc);
}
void ShowDBStmtError(HWND hwnd,SQLHSTMT hstmt)
{
ShowDBError(hwnd,SQL_HANDLE_STMT,hstmt);
}
INT_PTR CALLBACK About1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
ghdlg=hDlg;
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
switch(LOWORD(wParam))
{
case IDC_BUTTON2://保存
{
Save(hDlg);
break;
}
case IDC_BUTTON1://确认登陆
{
Login(hDlg);
break;
}
default:break;
}
}
}
return (INT_PTR)FALSE;
}
void Save(HWND hwnd)
{
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN result;
SQLWCHAR ConnStrIn[MAXBUFLEN] = L"DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=database2;CharSet=gb2312;";
SQLWCHAR ConnStrOut[MAXBUFLEN];
//分配环境句柄
result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,
&henv);
//设置管理环境属性
result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);
//分配连接句柄
result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,
(void*)LOGIN_TIMEOUT, 0);
//连接数据库
result = SQLDriverConnect(hdbc,NULL,ConnStrIn,SQL_NTS,ConnStrOut,MAXBUFLEN,(SQLSMALLINT*)0,SQL_DRIVER_NOPROMPT);
if(SQL_ERROR==result)
{
ShowDBConnError(hwnd,hdbc);
return;
}
//初始化语句句柄
result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//SQL_NTS telling the function the previous parameter is NullTerminated String,
//please alculate the string length for me
SQLWCHAR username[256];
SQLWCHAR password[256];
GetDlgItemText(hwnd,IDC_EDIT1,username,sizeof(username)/sizeof(SQLWCHAR));
GetDlgItemText(hwnd,IDC_EDIT2,password,sizeof(password)/sizeof(SQLWCHAR));
SQLWCHAR sql[256];
wsprintf(sql,TEXT("insert into t_user1(FUserName,FPassWord) values('%s','%s')"),username,password);
if (*username==NULL ||*password==NULL)
{
MessageBox(hwnd,TEXT("有户名或密码不为空!"),TEXT("注册"),MB_OK|MB_ICONERROR);
return;
}
result = SQLPrepare(hstmt,(SQLWCHAR*)sql,SQL_NTS);
CHECKDBSTMTERROR(hwnd,result,hstmt);
result =SQLExecute(hstmt);
CHECKDBSTMTERROR(hwnd,result,hstmt);
SQLFreeStmt(hstmt,SQL_CLOSE);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
MessageBox(hwnd,TEXT("保存成功"),TEXT("注册"),MB_OK|MB_ICONINFORMATION);
SetDlgItemText(hwnd,IDC_EDIT1,NULL);
SetDlgItemText(hwnd,IDC_EDIT2,NULL);
}
void Login(HWND hwnd)
{
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN result;
SQLWCHAR ConnStrIn[MAXBUFLEN] = L"DRIVER={MySQL ODBC 5.1 Driver};SERVER={127.0.0.1};UID=root;PWD=root;DATABASE=database2;CharSet=GBK;";
SQLWCHAR ConnStrOut[MAXBUFLEN];
//分配环境句柄
result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,
&henv);
//设置管理环境属性
result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);
//分配连接句柄
result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,
(void*)LOGIN_TIMEOUT, 0);
//连接数据库
result = SQLDriverConnect(hdbc,NULL,ConnStrIn,SQL_NTS,ConnStrOut,MAXBUFLEN,(SQLSMALLINT*)0,SQL_DRIVER_NOPROMPT);
if(SQL_ERROR==result)
{
ShowDBConnError(hwnd,hdbc);
return;
}
//初始化语句句柄
result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//SQL_NTS telling the function the previous parameter is NullTerminated String,
//please alculate the string length for me
result = SQLPrepare(hstmt,(SQLWCHAR*)L"select FUserName,FPassWord from t_user1",SQL_NTS);
CHECKDBSTMTERROR(hwnd,result,hstmt);
result =SQLExecute(hstmt);
CHECKDBSTMTERROR(hwnd,result,hstmt);
SQLINTEGER cbsatid=SQL_NTS;
SQLWCHAR Inputusername[20];
SQLWCHAR Inputpassword[20];
GetDlgItemText(hwnd,IDC_EDIT3,Inputusername,30);
GetDlgItemText(hwnd,IDC_EDIT4,Inputpassword,30);
int found=1;
while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)
{
SQLWCHAR username[20];
SQLGetData(hstmt,1,SQL_C_WCHAR,username,30,&cbsatid);
SQLWCHAR password[20];
SQLGetData(hstmt,2,SQL_C_WCHAR,password,30,&cbsatid);
if (lstrcmpW(Inputpassword,password)==0)
{
if (lstrcmpW(Inputusername,username)==0)
{
MessageBox(hwnd,TEXT("登陆成功"),TEXT("login"),MB_OK|MB_ICONINFORMATION);
SetDlgItemText(hwnd,IDC_EDIT4,NULL);
found=0;
break;
}
}
}
if (1==found)
{
MessageBox(hwnd,TEXT("登陆失败"),TEXT("login"),MB_OK|MB_ICONERROR);
}
SQLFreeStmt(hstmt,SQL_CLOSE);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
}
定义Save, Login两个函数,传入参数为句柄;
VC++的程序,入口点为_tWinMain();
ShowDBError函数,接收SQLSMALLINT和SQLHANDLE类型参数,显示数据库执行错误;
SQLHENV, 环境句柄;
SQLHDBC,连接句柄;
SQLHSTMT,语句句柄;
分配句柄,然后调用SQLDriverConnect连接数据库;
分配语句句柄,准备语句,然后执行;
SQLFetch()函数在结果集中检索下一行元组;
0 0
- ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
- ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录
- Python 实现简单的用户注册和登录
- PHP+MySQL实现用户登录注册API接口
- Java+Tomcat+MySQL实现简单的网页注册和登录
- Ucenter的用户注册和登录分析
- Ucenter的用户注册和登录分析
- 基于ODBC API实现对数据库的访问
- 通过ODBC API实现对数据库的访问(转)
- 基于ODBC API实现对数据库的访问
- 用python连接数据库,实现用户注册和用户登录
- 用户注册登录案例分析以及简单实现
- 基于ajax+php+mysql数据库实现用户注册登录
- Apache-mina框架学习之简单的用户登录与注册(MySql数据库)
- ODBC API访问数据库
- android安卓Sqlite3数据库实现用户登录注册的代码设计详解
- 简单的用户注册登录
- 简单的用户登录注册
- windows安装zabbix_agent
- 【OMNet++】tictoc示例三
- CI框架整合smarty模板
- 软件设计
- 数据库
- ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
- mysql 基本命令和知识
- repo同步代码过程中,提示gpg: Can't check signature: public key not found
- HTML5本地存储——IndexedDB(二:索引)
- C++ 服务器客户端编程实例(一)
- MySql like模糊查询通配符使用详细介绍
- 关于iOS多线程,你看我就够了
- Java设计模式_行为型_备忘录模式_大话西游之月光宝盒
- swing嵌入ocx或dll影像控件