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

//在IT行业,不懂数据库是不行的,我自己在学校里还没有学过数据库有关的知识,不过由于前些日子写项目的要求,不得不去琢磨,虽然有很多数据库类别,包括微软的 SQL server ,access,ORACLE公司的ORACL和mysql ,还有DB2等多种数据库,最终我选择学习mysql,因为它是免费的,呵呵,当然它也是高效的,同时是开发网络程序的不二选择,我以前写过一个登陆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);
   
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值