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()函数在结果集中检索下一行元组;




0 0
原创粉丝点击