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

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

时间:2024-11-20 09:18:51浏览次数:1  
标签:result cout mydata MySQL C++ VS2010 str mysql sqlstr

目录

    代码
    #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()函数中

    标签:result,cout,mydata,MySQL,C++,VS2010,str,mysql,sqlstr
    From: https://www.cnblogs.com/henghuixinda/p/18556114

    相关文章

    • 使用cmd连接mysql数据库
      一、准备工作在开始之前,确保你已经安装了MySQL数据库,并且知道以下信息:MySQL的安装路径用户名(通常是root)密码二、打开CMD并切换到MySQL的bin目录打开CMD:​ 按下Windows+R键,输入cmd,然后按回车。切换到MySQL的bin目录:​ 使用cd命令切换到MySQL安装路径下的bin目录。例如,如......
    • 针对初学者的C和C++23的对比学习-4.循环结构的学习
      4.循环结构的学习学习目标:学习内容:了解for语句:for循环的执行流程了解while语句:while循环的执行流程了解dowhile语句:dowhile循环的执行流程了解break和continue的使用for,while和dowhile的对比练习学习目标:了解循环结构了解for语句了解while语句了解d......
    • MySQL数据库实用教程(4)
      数据查询语言--语法格式SELECT[ALL|DISTINCT|DISTINCTROW]列名或表达式.../*SELECT子句*/[FROM源表...] /*FROM子句*/[WHERE条件] /*WHERE子句*/[......
    • 使用MySQL
      1.了解数据库和表1.1showSHOWDATABASES;SHOWDATABASES;返回可用数据库的一个列表。包含在这个列表中的可能是MySQL内部使用的数据库SHOWTABLES;为了获得一个数据库内的表的列表,使用SHOWTABLES;SHOWSTATUS,用于显示广泛的服务器状态信息;SHOWGRANTS,用来显示授予......
    • JavaFX + MySQL:动态显示数据库查询结果的JavaFX应用程序
      文章目录示例概述示例代码导入必要的包定义主类和主方法详细解释导入必要的包定义主类和主方法连接数据库并处理查询结果运行效果示例数据库表结构注意事项示例概述我们将创建一个JavaFX应用程序,该应用程序连接到MySQL数据库,查询某个表中的数据,并将结果显示在一......
    • 一文带你从入门到精通——MySQL(一)
      目录一. MySQL基础知识1.1引言1.2数据库1.2.1数据库简介1.2.2 数据库分类1.3SQL语句1.3.1SQL通用语法1.3.2SQL数据类型1.3.3SQL字段约束1.3.3.1主键约束1.3.3.2 非空约束1.3.3.3 唯一约束1.3.3.4 默认约束1.3.3 SQL分类1.3.3.1常用DDL1.3.3.2 ......
    • 一文带你从入门到精通——MySQL(二)
      建议先阅读我的上一篇博客,掌握一定的MySQL基础知识后再阅读本文,链接如下:一文带你从入门到精通——MySQL(一)-CSDN博客、目录二、MySQL单表查询2.1基础查询2.2条件查询2.3排序查询2.4聚合查询2.5分组查询2.6分页查询2.7MySQL语句的执行顺序二、MySQL单表查询......
    • C++语言之模版与类型转换
      模版C++的泛型编程可以将数据类型作为参数进行传递关键字:    C++模版的语法使用"<>"来表示泛型类型,并使用关键字template来定义和声明模版分类:    模版函数    模版类模版函数语法:    template<class假设的类型1,class假设......
    • 《C++ 构建区块链:创世区块的初始化之道》
      在区块链这个神秘而充满魅力的技术领域中,用C++构建区块链是一项极具挑战性和创新性的工作。而其中,初始化创世区块是整个区块链大厦的基石,它承载着区块链的起源和根本属性,就像生命起源中的第一个细胞一样重要。今天,我们就来深入探讨一下在C++构建区块链时,如何进行创世区......
    • 《C++ 实现区块链:区块时间戳的存储与验证机制解析》
      在区块链这个复杂而精妙的技术架构中,时间戳是一个至关重要的元素,尤其当我们使用C++来实现区块链时,对区块时间戳的存储和验证机制设计更是不容忽视。这一机制如同区块链的时间脉搏,为整个系统的有序运行和数据可信性提供了坚实的保障。时间戳在区块链中的核心意义时间戳在......