日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析

發(fā)布時(shí)間:2025/4/14 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ODBC + WIN32 API 訪問MYSQL 數(shù)據(jù)庫實(shí)現(xiàn)簡單QQ用戶注冊和登錄 的代碼分析
.
/
?
// datadase odbc1.cpp : 定義應(yīng)用程序的入口點(diǎn)。
?//
?
#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; ? ? ? ?// 當(dāng)前實(shí)例
?TCHAR szTitle[MAX_LOADSTRING]; ? ? // 標(biāo)題欄文本
?TCHAR szWindowClass[MAX_LOADSTRING]; ? // 主窗口類名
?HWND ghdlg;
?
// 此代碼模塊中包含的函數(shù)的前向聲明:
??
?


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;
?}
?
?
?
//
?// ?函數(shù): MyRegisterClass()
?//
?// ?目的: 注冊窗口類。
?//
?// ?注釋:
?//
?// ? ?僅當(dāng)希望
?// ? ?此代碼與添加到 Windows 95 中的“RegisterClassEx”
?// ? ?函數(shù)之前的 Win32 系統(tǒng)兼容時(shí),才需要此函數(shù)及其用法。調(diào)用此函數(shù)十分重要,
?// ? ?這樣應(yīng)用程序就可以獲得關(guān)聯(lián)的
?// ? ?“格式正確的”小圖標(biāo)。
?//
??
?
//
?// ? 函數(shù): InitInstance(HINSTANCE, int)
?//
?// ? 目的: 保存實(shí)例句柄并創(chuàng)建主窗口
?//
?// ? 注釋:
?//
?// ? ? ? ?在此函數(shù)中,我們在全局變量中保存實(shí)例句柄并
?// ? ? ? ?創(chuàng)建和顯示主程序窗口。
?//
??
?
//
?// ?函數(shù): WndProc(HWND, UINT, WPARAM, LPARAM)
?//
?// ?目的: 處理主窗口的消息。
?//
?// ?WM_COMMAND - 處理應(yīng)用程序菜單
?// ?WM_PAINT - 繪制主窗口
?// ?WM_DESTROY - 發(fā)送退出消息并返回
?//
?//
?


?
??
?


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("數(shù)據(jù)庫執(zhí)行錯(cuò)誤"),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://確認(rèn)登陸
? ? ?{
? ? ? 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];
? ?//分配環(huán)境句柄
? ?result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,
? ?&henv);
? ?//設(shè)置管理環(huán)境屬性
? ?result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);
? ?//分配連接句柄
? ?result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
? ?//設(shè)置連接屬性
? ?result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,
? ?(void*)LOGIN_TIMEOUT, 0);
? ?//連接數(shù)據(jù)庫
? ?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];
? ?//分配環(huán)境句柄
? ?result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,
? ?&henv);
? ?//設(shè)置管理環(huán)境屬性
? ?result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);
? ?//分配連接句柄
? ?result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
? ?//設(shè)置連接屬性
? ?result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT,
? ?(void*)LOGIN_TIMEOUT, 0);
? ?//連接數(shù)據(jù)庫
? ?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兩個(gè)函數(shù),傳入?yún)?shù)為句柄;
VC++的程序,入口點(diǎn)為_tWinMain();
ShowDBError函數(shù),接收SQLSMALLINT和SQLHANDLE類型參數(shù),顯示數(shù)據(jù)庫執(zhí)行錯(cuò)誤;


? SQLHENV, 環(huán)境句柄;
? ?SQLHDBC,連接句柄;
? ?SQLHSTMT,語句句柄;


分配句柄,然后調(diào)用SQLDriverConnect連接數(shù)據(jù)庫;
分配語句句柄,準(zhǔn)備語句,然后執(zhí)行;
SQLFetch()函數(shù)在結(jié)果集中檢索下一行元組;




總結(jié)

以上是生活随笔為你收集整理的ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。