ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
生活随笔
收集整理的這篇文章主要介紹了
ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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()函數在結果集中檢索下一行元組;
總結
以上是生活随笔為你收集整理的ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP/IP 网络数据封包和解包
- 下一篇: Linux安全编程