C++中使用MySQL

我的电脑上的软件如下:

VS2012 

MySQL 5.6

操作系统是64位win8.1


1.前提

下载并安装MySQL 

2.配置

(1)在项目中 属性》C++》常规》添加附加包含目录:MY_SQL的目录/include

(2)在项目中 属性》连接器》常规》添加附加库目录:MY_SQL的目录/lib

(3)在项目中 属性》连接器》输入》添加附加依赖项:libmysql.lib

3.注意事项

如果已经按上述配置好但是还是编译不通过,提示:

1>  正在生成代码...
1>BaseDB.obj : error LNK2019: 无法解析的外部符号 _mysql_init@4,该符号在函数 "public: bool __thiscall BaseDB::openConnect(void)" (?openConnect@BaseDB@@QAE_NXZ) 中被引用
1>BaseDB.obj : error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 "public: bool __thiscall BaseDB::openConnect(void)" (?openConnect@BaseDB@@QAE_NXZ) 中被引用
1>BaseDB.obj : error LNK2019: 无法解析的外部符号 _mysql_query@8,该符号在函数 "public: struct st_mysql_res * __thiscall BaseDB::doQuery(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?doQuery@BaseDB@@QAEPAUst_mysql_res@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中被引用
1>BaseDB.obj : error LNK2019: 无法解析的外部符号 _mysql_store_result@4,该符号在函数 "public: struct st_mysql_res * __thiscall BaseDB::doQuery(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?doQuery@BaseDB@@QAEPAUst_mysql_res@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中被引用
1>BaseDB.obj : error LNK2019: 无法解析的外部符号 _mysql_close@4,该符号在函数 "public: void __thiscall BaseDB::closeConnect(void)" (?closeConnect@BaseDB@@QAEXXZ) 中被引用
1>DBUtil.obj : error LNK2019: 无法解析的外部符号 _mysql_free_result@4,该符号在函数 "public: static bool __cdecl DBUtil::checkUserLogin(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?checkUserLogin@DBUtil@@SA_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) 中被引用
1>E:\Flighting\MySQLtest\ConsoleApplication1\Debug\ConsoleApplication1.exe : fatal error LNK1120: 6 个无法解析的外部命令
1>
1>生成失败。


这个问题的产生原因是:你装的MySQL64位的,而VS2012默认的运行平台是32位的所以不支持

解决办法有两个:(1)项目属性》右上角有一个配置管理器》把你的项目的运行平台改为X64(如果没有就新建一个)

(2)如果项目中已经引入了其他32位的附加库,贸然修改成64位会导致原来的库编译不通过,这样没办法只好上网搜一个mysql32为的lib和dll


最后,如果运行时提示找不到libmysql.dll 就把libmysql,dll复制到System32/SysWow64 吧


代码实例:

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h> 
#include <iostream>
using namespace std;

int main()
{
    const char user[] = "root";         //username
    const char pswd[] = "root";         //password
    const char host[] = "localhost";    //or"127.0.0.1"
    const char table[] = "test";        //database
    unsigned int port = 3306;           //server port        
    MYSQL myCont;
    MYSQL_RES *result;
    MYSQL_ROW sql_row;
    MYSQL_FIELD *fd;
    char column[32][32];
    int res;
    mysql_init(&myCont);
    if(mysql_real_connect(&myCont,host,user,pswd,table,port,NULL,0))
    {
        cout<<"connect succeed!"<<endl;
        mysql_query(&myCont, "SET NAMES GBK"); //设置编码格式,否则在cmd下无法显示中文
        res=mysql_query(&myCont,"select * from samples");//查询
        if(!res)
        {
            result=mysql_store_result(&myCont);//保存查询到的数据到result
            if(result)
            {
                int i,j;
                cout<<"number of result: "<<(unsigned long)mysql_num_rows(result)<<endl;
                for(i=0;fd=mysql_fetch_field(result);i++)//获取列名
                {
                    strcpy(column[i],fd->name);
                }
                j=mysql_num_fields(result);
                for(i=0;i<j;i++)
                {
                    printf("%s\t",column[i]);
                }
                printf("\n");
                while(sql_row=mysql_fetch_row(result))//获取具体的数据
                {
                    for(i=0;i<j;i++)
                    {
                        printf("%s\n",sql_row[i]);
                    }
                    printf("\n");
                }
            }
        }
        else
        {
            cout<<"query sql failed!"<<endl;
        }
    }
    else
    {
        cout<<"connect failed!"<<endl;
    }
    if(result!=NULL) mysql_free_result(result);//释放结果资源
    mysql_close(&myCont);//断开连接
    return 0;
}


<think>嗯,用户想了解如何在C++使用MySQL。首先,我需要回忆一下自己以前学过的相关知识。记得C++连接MySQL通常有两种方法:使用MySQL官方提供的Connector/C++或者使用传统的C API。不过可能用户更倾向于比较现代的方法,或者需要详细步骤。 首先,应该考虑用户的开发环境。比如,他们是在Windows还是Linux下开发?不同的系统安装库的方法可能不同。但可能用户需要通用的步骤,或者分别介绍两种环境下的配置方法。不过可能先以Linux为例,因为很多C++开发者在Linux下工作,或者使用跨平台的方法。 接下来,可能需要介绍如何安装MySQL Connector/C++。比如在Ubuntu下使用apt安装,或者从官网下载。然后,如何在项目中包含头文件和链接库。这里可能需要给出具体的编译命令,比如使用g++时指定-I和-l选项。 然后,代码示例是关键。用户可能需要一个简单的例子,包括连接数据库、执行查询、处理结果等步骤。需要确保代码的正确性,比如正确的异常处理,防止内存泄漏,使用预处理语句防止SQL注入等。 另外,需要注意MySQL的版本兼容性,不同版本的Connector/C++可能有不同的API。例如,旧的版本可能使用不同的头文件或命名空间。所以可能需要提醒用户注意版本问题,并查看官方文档。 还有,用户可能对如何执行查询、插入数据、处理结果集这些基本操作感兴趣。可能需要分步骤讲解,比如建立连接、创建语句、执行查询、遍历结果集,最后释放资源。 另外,可能还需要提到错误处理,比如捕获异常,检查SQL执行是否成功,这对于编写健壮的代码很重要。此外,数据库连接池、事务处理这些高级话题可能暂时不需要深入,但可以提一下,供用户进一步学习。 可能还需要比较Connector/C++和传统的MySQL C API的区别,比如面向对象与过程式的区别,以及各自的优缺点。但用户可能更关注如何使用Connector/C++,因为它是官方推荐的现代方法。 最后,提醒用户注意安全事项,比如不要在代码中硬编码数据库密码,使用配置文件或环境变量,以及使用预处理语句防止SQL注入攻击。 总结下来,回答的结构应该是先介绍安装和配置步骤,然后给出一个简单的代码示例,解释每个部分的作用,最后补充一些注意事项和进一步学习的建议。这样用户就能有一个清晰的入门指南,并能根据示例开始自己的开发。</think>在 C++使用 MySQL 通常需要以下步骤,这里以官方推荐的 **MySQL Connector/C++** 为例,提供一个简明指南: --- ### 一、环境准备 1. **安装 MySQL 开发库** - **Linux (Ubuntu/Debian):** ```bash sudo apt-get install libmysqlcppconn-dev ``` - **Windows:** 从 [MySQL 官网](https://dev.mysql.com/downloads/connector/cpp/) 下载 Connector/C++ 并配置包含路径和库路径。 2. **包含头文件与链接库** ```cpp #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> // 执行 SQL 语句 #include <cppconn/resultset.h> // 处理查询结果 ``` --- ### 二、基础代码示例 ```cpp #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> int main() { try { // 1. 创建 MySQL 驱动实例 sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance(); // 2. 建立数据库连接 sql::Connection *con = driver->connect("tcp://127.0.0.1:3306", "用户名", "密码"); con->setSchema("数据库名"); // 选择数据库 // 3. 创建 Statement 对象并执行 SQL sql::Statement *stmt = con->createStatement(); stmt->execute("CREATE TABLE IF NOT EXISTS test(id INT, name VARCHAR(20))"); // 4. 插入数据(推荐使用 PreparedStatement 防注入) stmt->execute("INSERT INTO test VALUES (1, 'Alice')"); // 5. 查询数据 sql::ResultSet *res = stmt->executeQuery("SELECT * FROM test"); while (res->next()) { std::cout << "ID: " << res->getInt("id") << ", Name: " << res->getString("name") << std::endl; } // 6. 释放资源 delete res; delete stmt; delete con; } catch (sql::SQLException &e) { std::cerr << "MySQL Error: " << e.what() << std::endl; } return 0; } ``` --- ### 三、编译命令(Linux 示例) ```bash g++ your_code.cpp -o app -I/usr/include/mysql -lmysqlcppconn ``` --- ### 四、高级用法 1. **预处理语句(防 SQL 注入)** ```cpp sql::PreparedStatement *pstmt = con->prepareStatement("INSERT INTO test VALUES (?, ?)"); pstmt->setInt(1, 2); pstmt->setString(2, "Bob"); pstmt->execute(); delete pstmt; ``` 2. **事务处理** ```cpp con->setAutoCommit(false); // 关闭自动提交 // 执行多个操作... con->commit(); // 提交事务 // 或 con->rollback(); // 回滚 ``` --- ### 五、注意事项 - **错误处理**:始终捕获 `sql::SQLException` 异常。 - **资源释放**:手动管理指针内存(或使用智能指针封装)。 - **连接参数**:生产环境避免硬编码密码,建议使用配置文件或环境变量。 - **性能优化**:考虑使用连接池(如第三方库或自行实现)。 --- ### 六、替代方案 - **MySQL C API**:更底层的 C 接口(`#include <mysql/mysql.h>`),性能高但代码更复杂。 - **ORM 框架**:如 [ODB](https://www.codesynthesis.com/products/odb/) 或 [sqlpp11](https://github.com/rbock/sqlpp11),简化数据库操作。 建议参考 [MySQL Connector/C++ 官方文档](https://dev.mysql.com/doc/connector-cpp/8.0/en/) 获取详细说明。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值