1.右击项目->属性->配置属性->"C/C++"->常规,在“附加包含目录”中将刚刚所说的"include"及"include\cppconn"的路径包含进来。
2.属性->配置属性->链接器->常规,在“附加库目录”中将刚刚所提的"lib"文件夹下的子文件夹"opt"的路径包含进来。
3.属性->配置属性->链接器->输入,在“附加依赖项”中添加"mysqlcppconn.lib,mysqlcppconn-static.lib"这两项(这两项其实是"lib"文件夹下的两个lib文件)。
4.将"MySQL Connector C++ 1.0.5\lib\opt"下的"mysqlcppconn.dll"文件复制到windows\system32文件夹下或直接复制到项目所在路径下的debug文件夹下。
5.将"MySQL安装目录\lib\opt"下的"libmysql.dll"文件复制到windows\system32文件夹下。
起初下载 mysql-connector-c++-1.1.4-x64.msi,遇到问题
unresolved external symbol "__declspec(dllimport) class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_mysql_driver_instance(void)" (__imp_?get_mysql_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ) referenced in function "void __cdecl RunConnectMySQL(void)" (?RunConnectMySQL@@YAXXZ)。
然后尝试使用x64项目出现其他问题,最后下载 mysql-connector-c++-1.1.4-win32.msi
Statement对象用于向MySQL服务器发送SQL语句。该对象可以通过调用Connection::createStatement方法获得。Statement向MySQL发送一个静态的SQL语句,然后从MySQL获取操作的结果,我们无法向它提供sql参数。如果要向它传递参数,可以使用PreparedStatemenet类。如果相同的SQL语句(只SQL参数不同)要被执行多次,建议使用PreparedStatement类。
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
//#define CPPCONN_LIB_BUILD
#include <mysql_connection.h>
#include <mysql_driver.h>
#include <cppconn/driver.h>
#include <cppconn/statement.h>
#include <cppconn/metadata.h>
using namespace sql;
using namespace std;
void Test3()
{
Driver* pDriver = get_driver_instance();
Connection* pConnt = pDriver->connect("127.0.0.1", "root", "gamedev");
pConnt->setSchema("register");
Statement* pState = pConnt->createStatement();
if (pState->execute("select * from test"))
{
ResultSet* pRes = pState->getResultSet();
while (pRes->next())
{
cout << pRes->getInt("id") << "\t";
cout << pRes->getInt("age") << endl;
}
}
else
{
cout << "createStatement failed" << endl;
return;
}
int nCnt = pState->executeUpdate("insert into test (id,age) values('1','2')");
cout << nCnt << endl;
if (pState->execute("insert into test (id,age) values('1','2')"))
{
int nCnt = pState->getUpdateCount();
cout << nCnt << endl;
}
else
{
cout << "execute insert into test (id,age) values('1','2') failed" << endl;
return;
}
delete pState;
delete pConnt;
}
void Test1()
{
mysql::MySQL_Driver *driver = nullptr;
Connection *conn = nullptr;
try
{
driver = sql::mysql::get_mysql_driver_instance();
//等价于下面两个语句
conn = driver->connect("tcp://localhost:3306/register", "root", "gamedev");
//conn = driver->connect("tcp://localhost:3306/", "root", "gamedev");
//conn->setSchema("register");
cout << "连接成功" << endl;
}
catch (...)
{
cout << "连接失败" << endl;
}
Statement *stat = nullptr;
stat = conn->createStatement();
ResultSet *pRes;
pRes = stat->executeQuery("select * from test");
while (pRes->next())
{
cout << pRes->getInt("id") << "\t";
cout << pRes->getInt("age") << endl;
}
delete conn;
delete stat;
}
int _tmain(int argc, _TCHAR* argv[])
{
Test3();
getchar();
return 0;
}
上面的段落介绍了执行SQL查询的方法:executeQuery和execute,用于获取ResultSet对象。我们可以通过ResultSet访问查询的结果。每一个ResultSet都包含一个游标(cursor),它指向数据集中的当前记录行。ResultSet中排列的记录是有序的(译者注:只能按顺序一条一条获取,不能跳跃式获取)。(但)在同一行中,列值的访问却是随意的:可以通过列的位置或者名称。通过列的名称访问列值让代码更清晰,而通过位置访问列值则更高效。
在ResultSet中的数据,可以通过getXX系列方法来获取,例如:getString(), getInt(),"XX"取决于数据的类型。next()与previous()使游标移到结果集中的下一条或上一条记录。
void Test1()
{
mysql::MySQL_Driver *driver = nullptr;
Connection *conn = nullptr;
try
{
driver = sql::mysql::get_mysql_driver_instance();
//等价于下面两个语句
conn = driver->connect("tcp://localhost:3306/register", "root", "gamedev");
//conn = driver->connect("tcp://localhost:3306/", "root", "gamedev");
//conn->setSchema("register");
cout << "连接成功" << endl;
}
catch (...)
{
cout << "连接失败" << endl;
}
Statement *stat = nullptr;
stat = conn->createStatement();
ResultSet *pRes;
pRes = stat->executeQuery("select * from test order by id asc");
pRes->afterLast();
if (!pRes->isAfterLast())
{
throw("pRes is not AfterLast");
}
while (pRes->previous())
{
cout << pRes->getInt("id") << "\t";
cout << pRes->getInt("age") << endl;
}
delete conn;
delete stat;
}