// MysqlDemo.cpp : 定义控制台应用程序的入口点。
// 静态库必须跟vs版本相匹配,不然报错(LNK2038 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1900”)
// 包含文件:mysql-connector-c++的include与boost的根目录
// lib包含:mysqlcppconn-static.lib
#include "stdafx.h"
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <memory>
#include <algorithm>
// 表示是静态编译
#ifndef _DEBUG
#define CPPCONN_LIB_BUILD
#endif
#include "mysql_driver.h"
#include "mysql_connection.h"
#include "cppconn/driver.h"
#include "cppconn/statement.h"
#include "cppconn/prepared_statement.h"
#include "cppconn/metadata.h"
#include "cppconn/exception.h"
#define DBHOST "tcp://127.0.0.1:3306"
#define USER "root"
#define PASSWORD ""
#define DATABASE "mydb"
using namespace std;
using namespace sql;
#pragma comment(lib, "mysqlcppconn-static.lib")
static void GetDBMetaData(Connection *dbcon);
vector<map<string, string>> getQueryResult(Statement *stmt, const string &sql);
int main(int argc, char *argv[])
{
Driver *driver;
Connection *con;
Statement *stmt;
PreparedStatement *prep_stmt;
Savepoint *savept;
int updatecount = 0;
try
{
// 获取数据库驱动
driver = get_driver_instance();
// 连接数据库
con = driver->connect(DBHOST, USER, PASSWORD);
// 关闭自动提交
con->setAutoCommit(0);
cout << "当前数据库提交模式:" << con->getAutoCommit() << endl;
// 选择数据库
con->setSchema(DATABASE);
// 打印当前数据库的基本信息
GetDBMetaData(con);
// 从连接池中获取一个数据库的映射实例
stmt = con->createStatement();
auto res = getQueryResult(stmt, "SELECT username,password FROM user ORDER BY id ASC LIMIT 10");
// 打印第一条数据的用户名和密码
cout << res[0]["username"] << "--" << res[0]["password"] << endl;
// 向表中插入数据
prep_stmt = con->prepareStatement("INSERT INTO user (username,password,addtime) VALUES (?,?,?)");
prep_stmt->setString(1, "liujun");
prep_stmt->setString(2, "56464");
prep_stmt->setString(3, "20132563");
// 执行更新操作
updatecount = prep_stmt->executeUpdate();
// 设置一个事务断点
savept = con->setSavepoint("SAVEPT1");
// 执行更新操作,此操作在事务SAVEPT1中
prep_stmt->setString(1, "sdfsdfsd");
prep_stmt->setString(2, "12641561");
prep_stmt->setString(3, "1611561565");
updatecount = prep_stmt->executeUpdate();
// 回滚事务SAVEPT1
con->rollback(savept);
// 释放此事务断点
con->releaseSavepoint(savept);
// 将此前的所有操作一次性提交
con->commit();
// 删除堆中的指针
delete stmt;
delete savept;
delete prep_stmt;
// 关闭数据库连接,并清除该指针
con->close();
delete con;
}
catch (SQLException &e) {
cout << "ERROR: " << e.what() << " (MySQL error code: "
<< e.getErrorCode() << ", SQLState: " << e.getSQLState() << ")" << endl;
if (e.getErrorCode() == 1047) {
cout << "您的数据库版本可能过低. " << endl;
}
}
catch (std::runtime_error &e) {
cout << "ERROR: " << e.what() << endl;
}
getchar();
return 0;
}
/* 封装查询语句*/
vector<map<string, string>> getQueryResult(Statement *stmt, const string &sql) {
// 获取查询结果
ResultSet *pres = stmt->executeQuery(sql);
ResultSetMetaData *pres_meta = pres->getMetaData();
// 声明返回值
vector<map<string, string>> retArray;
// 查询的字段总数
int field_num = pres_meta->getColumnCount();
map<string, string> col;
while (pres->next())
{
for (int i = 0; i < field_num; ++i)
col.insert(make_pair(pres_meta->getColumnLabel(i + 1), pres->getString(i + 1)));
retArray.push_back(col);
col.clear();
}
delete pres;
return retArray;
}
/* 获取数据库信息 */
static void GetDBMetaData(Connection *dbcon)
{
if (dbcon->isClosed())
throw runtime_error("DatabaseMetaData FAILURE - database connection closed");
cout << "Database Metadata" << endl;
cout << "-----------------" << endl;
// 查询数据库基本信息
DatabaseMetaData *dbcon_meta = dbcon->getMetaData();
cout << "Database Product Name: " << dbcon_meta->getDatabaseProductName() << endl;
cout << "Database Product Version: " << dbcon_meta->getDatabaseProductVersion() << endl;
cout << "Database User Name: " << dbcon_meta->getUserName() << endl << endl;
cout << "Driver name: " << dbcon_meta->getDriverName() << endl;
cout << "Driver version: " << dbcon_meta->getDriverVersion() << endl << endl;
cout << "Database in Read-Only Mode?: " << dbcon_meta->isReadOnly() << endl;
cout << "Supports Transactions?: " << dbcon_meta->supportsTransactions() << endl;
cout << "Supports DML Transactions only?: " << dbcon_meta->supportsDataManipulationTransactionsOnly() << endl;
cout << "Supports Batch Updates?: " << dbcon_meta->supportsBatchUpdates() << endl;
cout << "Supports Outer Joins?: " << dbcon_meta->supportsOuterJoins() << endl;
cout << "Supports Multiple Transactions?: " << dbcon_meta->supportsMultipleTransactions() << endl;
cout << "Supports Named Parameters?: " << dbcon_meta->supportsNamedParameters() << endl;
cout << "Supports Statement Pooling?: " << dbcon_meta->supportsStatementPooling() << endl;
cout << "Supports Stored Procedures?: " << dbcon_meta->supportsStoredProcedures() << endl;
cout << "Supports Union?: " << dbcon_meta->supportsUnion() << endl << endl;
cout << "Maximum Connections: " << dbcon_meta->getMaxConnections() << endl;
cout << "Maximum Columns per Table: " << dbcon_meta->getMaxColumnsInTable() << endl;
cout << "Maximum Columns per Index: " << dbcon_meta->getMaxColumnsInIndex() << endl;
cout << "Maximum Row Size per Table: " << dbcon_meta->getMaxRowSize() << " bytes" << endl;
// 查看数据库中有多少库,以及库名是什么
shared_ptr < ResultSet > rs(dbcon_meta->getSchemas());
cout << "Total number of schemas = " << rs->rowsCount() << endl;
for (int row = 1; rs->next(); ++row)
cout << row << "=>" << rs->getString("TABLE_SCHEM") << endl;
}