C++ 之 VS2010 和MySQL数据库的链接问题

目录

    代码
    #include <winsock.h>
    #include
    #include
    #include <mysql.h>
    using namespace std;
    #pragma comment(lib, "ws2_32.lib")
    #pragma comment(lib, "libmysql.lib")
    //单步执行,不想单步执行就注释掉
    #define STEPBYSTEP
    int main() {
    cout << "****************************************" << endl;
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //必备的一个数据结构
    MYSQL mydata;

    //初始化数据库
    if (0 == mysql_library_init(0, NULL, NULL)) {
    cout << "mysql_library_init() succeed" << endl;
    } else {
    cout << "mysql_library_init() failed" << endl;
    return -1;
    }
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //初始化数据结构
    if (NULL != mysql_init(&mydata)) {
    cout << "mysql_init() succeed" << endl;
    } else {
    cout << "mysql_init() failed" << endl;
    return -1;
    }
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //在连接数据库之前,设置额外的连接选项
    //可以设置的选项很多,这里设置字符集,否则无法处理中文
    if (0 == mysql_options(&mydata, MYSQL_SET_CHARSET_NAME, "gbk")) {
    cout << "mysql_options() succeed" << endl;
    } else {
    cout << "mysql_options() failed" << endl;
    return -1;
    }
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //连接数据库
    if (NULL
    != mysql_real_connect(&mydata, "localhost", "root", "test", "test",
    3306, NULL, 0))
    //这里的地址,用户名,密码,端口可以根据自己本地的情况更改
    {
    cout << "mysql_real_connect() succeed" << endl;
    } else {
    cout << "mysql_real_connect() failed" << endl;
    return -1;
    }
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //sql字符串
    string sqlstr;

    //创建一个表
    sqlstr = "CREATE TABLE IF NOT EXISTS user_info";
    sqlstr += "(";
    sqlstr +=
    "user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Unique User ID',";
    sqlstr +=
    "user_name VARCHAR(100) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NULL COMMENT 'Name Of User',";
    sqlstr +=
    "user_second_sum INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'The Summation Of Using Time'";
    sqlstr += ");";
    if (0 == mysql_query(&mydata, sqlstr.c_str())) {
    cout << "mysql_query() create table succeed" << endl;
    } else {
    cout << "mysql_query() create table failed" << endl;
    mysql_close(&mydata);
    return -1;
    }
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //向表中插入数据
    sqlstr =
    "INSERT INTO user_info(user_name) VALUES('公司名称'),('一级部门'),('二级部门'),('开发小组'),('姓名');";
    if (0 == mysql_query(&mydata, sqlstr.c_str())) {
    cout << "mysql_query() insert data succeed" << endl;
    } else {
    cout << "mysql_query() insert data failed" << endl;
    mysql_close(&mydata);
    return -1;
    }
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //显示刚才插入的数据
    sqlstr = "SELECT user_id,user_name,user_second_sum FROM user_info";
    MYSQL_RES *result = NULL;
    if (0 == mysql_query(&mydata, sqlstr.c_str())) {
    cout << "mysql_query() select data succeed" << endl;

    //一次性取得数据集
    result = mysql_store_result(&mydata);
    //取得并打印行数
    int rowcount = mysql_num_rows(result);
    cout << "row count: " << rowcount << endl;
    
    //取得并打印各字段的名称
    unsigned int fieldcount = mysql_num_fields(result);
    MYSQL_FIELD *field = NULL;
    for (unsigned int i = 0; i < fieldcount; i++) {
        field = mysql_fetch_field_direct(result, i);
        cout << field->name << "\t\t";
    }
    cout << endl;
    
    //打印各行
    MYSQL_ROW row = NULL;
    row = mysql_fetch_row(result);
    while (NULL != row) {
        for (int i = 0; i < fieldcount; i++) {
            cout << row[i] << "\t\t";
        }
        cout << endl;
        row = mysql_fetch_row(result);
    }
    

    } else {
    cout << "mysql_query() select data failed" << endl;
    mysql_close(&mydata);
    return -1;
    }
    #ifdef STEPBYSTEP
    system("pause");
    #endif
    //删除刚才建的表
    sqlstr = "DROP TABLE user_info";
    if (0 == mysql_query(&mydata, sqlstr.c_str())) {
    cout << "mysql_query() drop table succeed" << endl;
    } else {
    cout << "mysql_query() drop table failed" << endl;
    mysql_close(&mydata);
    return -1;
    }
    mysql_free_result(result);
    mysql_close(&mydata);
    mysql_server_end();

    system("pause");
    return 0;
    }
    使用的是API方式,使用MySQL的数据库资源,所以需要包含头文件、连接Lib和获取相应的dll文件。
    vc的设置
    这里使用的是vs2010,所以附上vs2010的设置
    (1)打开VC6.0 工具栏Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装MySQL的include目录路径。(我的是D:Program FilesMySQLMySQL Server 5.0include)。
    vs2010中的设置,在:项目-属性-配置属性-VC目录-包含目录下划线
    (2)在上面说到的“Show directories for:”下拉列表中选中“Library files”,然后添加你本地安装MySQL的Lib目录路径。Lib目录下还有debug和opt两个目录,建议选debug。(我的是D:Program FilesMySQLMySQL Server 5.0libdebug)。
    vs2010中的设置,在:项目-属性-配置属性-VC目录-库目录
    或者:项目-属性-配置属性-连接器-常规-附加库目录
    (3)在“Project settings->Link:Object/library modules”里面添加“libmysql.lib”。
    vs2010中的设置,在:项目-属性-配置属性-连接器-输入-附加依赖项
    (4)在stdafx.h里面添加如下的内容:
    #include "mysql.h"
    #include "winsock.h" // 如果编译出错,则把该行放到#include "mysql.h"之前
    #pragma comment(lib,"libmySQL.lib") // 如果在附加依赖项里已增加,则就不要添加了
    (5)建议将“libmySQL.lib、libmySQL.dll”拷到你所建的工程的目录下。
    这个也需要!
    数据库的相关操作
    打开“开始->所有程序->MySQL->MySQL Server 5.0->MySQL Command Line Client.exe”,如果没有设置密码就直接按回车,会提示服务器启动成功。
    mysql> SHOW DATABASES;//显示所有的数据库,注意一定要 敲“;”后再按回车
    mysql> CREATE DATABASE mydb;//创建数据库
    mydb mysql> USE mydb;//选择你所创建的数据库
    mydb mysql> SHOW TABLES; //显示数据库中的表
    mysql> CREATE TABLE mytable (username VARCHAR(100), visitelist VARCHAR(200),
    remark VARCHAR(200));//创建一个表mytable: 用户名;访问列表;
    备注
    mysql> DESCRIBE mytable;//显示表的结构
    VC编程
    MYSQL mysql; //数据库连接句柄
    mysql_init (&mysql);
    if(!mysql_real_connect(&mysql,"localhost","root",NULL,"mydb",3306,NULL,0)) {//mydb为你所创建的数据库,3306为端口号,可自行设定 AfxMessageBox("数据库连接失败");
    return FALSE;
    }
    (1)实现添加 功能
    CString strUsername,strList,strRemark,strSQL;
    strSQL.Format("insert into mytable(username,visitelist,remark) values('%s','%s','%s')", strUsername,strList,strRemark);//注意一定要写在一行,而且必须要有''
    if(mysql_real_query(&mysql,(char)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){
    AfxMessageBox("增添失败");
    }
    (2)实现修改功能
    CString strUsername,strList,strRemark,strSQL,str_PreName;//str_PreName用于记录想要修改的行,详情请看源代码
    strSQL.Format("update mytable set username='%s',visitelist='%s', remark='%s' where username='%s'",strUsername,strList,strRemark,str_PreName);
    if(mysql_real_query(&mysql,(char
    )(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){ AfxMessageBox("修改失败");
    }
    (3)实现删除功能
    CString strSQL;
    strSQL.Format("delete from mytable where username='%s'",str_PreName);//必须要有'' if(mysql_real_query(&mysql,(char)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){
    AfxMessageBox("删除失败");
    }
    (4)读取表格内容到CListCtrl控件m_list
    m_list.DeleteAllItems();
    char ch_query;
    ch_query="select * from mytable";
    if(mysql_real_query(&mysql,ch_query,(UINT)strlen(ch_query))!=0){
    AfxMessageBox("数据库中表格出错");
    }
    CString str;
    MYSQL_RES result;
    MYSQL_ROW row;
    if(!(result=mysql_use_result(&mysql))){
    AfxMessageBox("读取数据集失败");
    }
    int i=0;
    while(row=mysql_fetch_row(result)){
    str.Format("%s",row[0]);
    m_list.InsertItem(i,str); str.Format("%s",row[1]);
    m_list.SetItemText(i,1,str);
    str.Format("%s",row[2]);
    m_list.SetItemText(i,2,str);
    i++;
    }
    mysql_free_result(result);
    做一些添加:
    while (row=mysql_fetch_row(result))
    {num=mysql_num_fields(result);
    for (int j=0;j<num;j++)
    ...}
    mysql_fetch_row依次获取受影响的行,当结束时返回NULL,mysql_num_fields获取该行的列数。注意,这里的row是char
    类型,即row[i]是char类型。
    (5)关闭数据库
    mysql_close(&mysql);//最好写到OnDestroy()函数中

    posted @ 2024-11-20 09:29  恒辉信达  阅读(8)  评论(0编辑  收藏  举报