vc连接mysql

连接数据库test 用户名root密码abc
在里面有一个username的表,describe username结果如下

mysql> describe username;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(10)     | YES  |     | NULL    |       |
| username | varchar(32) |      | PRI |         |       |
+----------+-------------+------+-----+---------+-------+

mysql> select * from username;
+------+----------+
| id   | username |
+------+----------+
|    1 | sfs      |
+------+----------+
1 row in set (0.00 sec)


本文目的查找执行select id from username这个语句并打印结果
  1. #include <unistd.h>
  2. #include <arpa/inet.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <mysql/mysql.h>
  10. #include <signal.h>
  11. #include <errno.h>
  12. #include <syslog.h>
  13. MYSQL mysql;
  14. main()
  15. {
  16. char host[32]="localhost";
  17. char user[32]="root";
  18. char passwd[32]="abc";
  19. char dbname[32]="test";

  20. if( mysql_init(&mysql) == NULL )
  21. {
  22. syslog(LOG_USER|LOG_INFO,"inital mysql handle error\n");
  23. return 1;
  24. }
  25. if (mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) == NULL)
  26. {
  27. syslog(LOG_USER|LOG_INFO, "Failed to connect to database: Error: %s\n",mysql_error(&mysql));
  28. return 1;
  29. }
  30. else syslog(LOG_USER|LOG_INFO, "connect to database: \n");
  31. find_ps();
  32. db_close();
  33. return 0;
  34. }
  35. int db_close()
  36. {
  37.         mysql_close(&mysql);
  38.          return 0;
  39. }


  40. int  find_ps ()
  41. {
  42. MYSQL_ROW m_row;
  43. MYSQL_RES *m_res;
  44. char sql[1024],username[32];
  45. int res=1;
  46. int *id;
  47. sprintf(sql,"select id from username");
  48. if(mysql_query(&mysql,sql) != 0)
  49. {
  50. syslog(LOG_USER|LOG_INFO, "select ps_info Error: %s\n",mysql_error(&mysql));
  51. return res;
  52. }
  53. m_res = mysql_store_result(&mysql);
  54. if(m_res==NULL)
  55. {
  56. syslog(LOG_USER|LOG_INFO, "select username Error: %s\n",mysql_error(&mysql));
  57. res = 3;
  58. return res;
  59. }
  60. if(m_row = mysql_fetch_row(m_res))
  61. {
  62. printf("m_row=%d\n",atoi(m_row[0]));
  63. res = 0;
  64. }
  65. mysql_free_result(m_res);
  66. return res;
  67. }
复制代码
编译命令
gcc -g connect_db.c -L/usr/lib/mysql -lmysqlclient -lz

注意:

如果/tmp/ccTGmMS21.o: In function `main':
/tmp/ccTGmMS21.o(.text+0x11): undefined reference to `mysql_init'
那么参数增加-L/usr/lib/mysql -lmysqlclient 

如果
usr/lib/mysql/libmysqlclient.a(my_compress.o): In function `my_uncompress':
my_compress.o(.text+0xaa): undefined reference to `uncompress'
那么增加-lz参数
作者: xouou_53320     时间: 2010-8-28 03:00

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include "resource.h"
#include "MainDlg.h"
#define LOGIN_TIMEOUT 30
#define MAXBUFLEN 255
#define CHECKDBSTMTERROR(hwnd,result,hstmt) if(SQL_ERROR==result){ShowDBStmtError(hwnd,hstmt);return;}

void DBTest(HWND hwnd);

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
                HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
    }
    return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_OK:
                DBTest(hwnd);
        break;

                default:
                break;
    }
}

void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}

void ShowDBError(HWND hwnd,SQLSMALLINT type,SQLHANDLE sqlHandle)
{
    char pStatus[10], pMsg[101];
    SQLSMALLINT SQLmsglen;
    char error[200] = {0};
    SQLINTEGER SQLerr;
    long erg2 = SQLGetDiagRec(type, sqlHandle,1,
                (SQLCHAR *)pStatus,&SQLerr,(SQLCHAR *)pMsg,100,&SQLmsglen);
    wsprintf(error,"%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);
}

void DBTest(HWND hwnd)
{
    SQLHENV henv = NULL;

        //SQLHDBC hdbc表示一个数据库的连接句柄,和socket连接类似,要访问数据库先要连接
        //SQLHDBC: SQL数据库,H句柄,DB是DataBase,C是Connection
    SQLHDBC hdbc = NULL;


    SQLHSTMT hstmt = NULL;//代表一个SQL语句,STMT是Statement 语句的意思

    SQLRETURN result;//执行结果

    /*
        SQLCHAR是unsigned char
    定义的这个ConnStrIn数组里存放着你要连接到的
        数据库的驱动(驱动名)
        服务器IP地址(本地的话就是127.0.0.1)
        用户名uid
        密码pwd
        数据库名(Catalog) DataBase
        字符编码方式等信息
        */
    SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=test;CharSet=gbk;";
    SQLCHAR 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);

        //连接数据库,ConnStrIn传递过来的DATABASE值,result是执行结果
    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 Null-Terminated String, 
        //please alculate the string length for me  
        //创建SQL语句
        result = SQLPrepare(hstmt,(SQLCHAR*)"select FName,FAge from t_person",SQL_NTS);
        CHECKDBSTMTERROR(hwnd,result,hstmt);//判断是否创建成功
    result =SQLExecute(hstmt);//执行语句
    CHECKDBSTMTERROR(hwnd,result,hstmt);//判断是否执行成功

        /*
        查看select语句的执行结果,按行读取,这种方式叫通过游标读取
        无论是在JDBC,ADO/ADO.net都以这种方式读取
    每次调用SQLFetch()就向下读一行,直到返回值为SQL_DATA_FOUND即末位的时候表示读到了最后
        类似于c语言文件访问时的EOF
        */
    SQLINTEGER cbsatid=SQL_NTS; //typedef long SQLINTEGER,SQL_NTS是终端标志?
        /* 读取第一列的姓名
    while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)   //hstmt是上面的SQL语句的指针,hstmt一开始就已定义(SQLHSTMT hstmt = NULL)
    {
                TCHAR name[20];  

                //SQLGetData()是按列读取,
                //第一个参数是SQL语句
                //第二个参数是要读取的列号(从1开始编号)
                //第三个参数是列的类型,这里的SQL_C_CHAR是宏定义就是字符串,在SQLExt.h中所有以SQL_C_开头的都是可以使用的参数
                //第四个参数是要存放到里面的指针
                //第五个参数是参数四(缓冲区)的大小,这里等于20字节
                //第六个不用管
        SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(TCHAR),&cbsatid);
                MessageBox(hwnd,name,TEXT("返回结果"),MB_OK);
    }
        */
    
        //读取第二列的整数年龄
    while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)   //hstmt是上面的SQL语句的指针,hstmt一开始就已定义(SQLHSTMT hstmt = NULL)
    {
                TCHAR name[20];                  
                //SQLGetData()是按列读取,
                //第一个参数是SQL语句
                //第二个参数是要读取的列号(从1开始编号)
                //第三个参数是列的类型,这里的SQL_C_CHAR是宏定义就是字符串,在SQLExt.h中所有以SQL_C_开头的都是可以使用的参数
                //第四个参数是要存放到里面的指针
                //第五个参数是参数四(缓冲区)的大小,这里等于20字节
                //第六个不用管
        SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(TCHAR),&cbsatid);
                MessageBox(hwnd,name,TEXT("返回结果"),MB_OK);
                 
                SQLINTEGER i_age; //typedef long SQLINTEGER
                //SQLGetData()是按列读取,
                //第一个参数是SQL语句
                //第二个参数是要读取的列号(从1开始编号)
                //第三个参数是列的类型,这里的SQL_C_CHAR是宏定义就是字符串,在SQLExt.h中所有以SQL_C_开头的都是可以使用的参数
                //第四个参数是要存放到里面的指针
                //第五个参数是参数四(缓冲区)的大小,这里等于20字节
                //第六个不用管
        SQLGetData(hstmt,2,SQL_C_LONG,&i_age,sizeof(i_age),&cbsatid);
                TCHAR str[20];
                wsprintf(str,TEXT("%s年龄是:%d"),name,i_age);
                MessageBox(hwnd,str,TEXT("返回结果"),MB_OK);
    }

        SQLFreeStmt(hstmt,SQL_CLOSE);//释放SQL语句
    SQLDisconnect(hdbc);          //断开连接的数据库
    SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV,henv);
        MessageBox(hwnd,TEXT("执行成功"),TEXT("标题"),MB_OK);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值