mysql-connector-c++ 学习一

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类。


   在执行SQL语句之前应该通过Connection对象的setSchema方法设置相应的Schema(如果没有在数据库地址URL中指定schema)。
    Statement::executeQuery用于执行一个Select语句,它返回ResultSet对象。Statement::executeUpdate方法主要用于执行INSERT, UPDATE, DELETE语句(executeUpdate可以执行所有的SQL语句,如DDL语句,像创建数据表。),该方法返回受影响记录的条数。
    如果你不清楚要执行的是像select这样的查询语句还是像update/insert/delete这样的操作语句,可以使用execute方法。对于查询语句,execute()返回True,然后通过getResultSet方法获取查询的结果;对于操作语句,它返回False,通过getUpdateCount方法获取受影响记录的数量。
    在一些特殊的情况下,单条SQL语句(如执行存储过程),可能会返回多个结果集 和/或 受影响的记录数量。如果你不想忽略这些结果,通过getResultSet或getUpdateCount方法第一个结果后,再通过getMoreResults()来获取其他的结果集。


// 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中排列的记录是有序的(译者注:只能按顺序一条一条获取,不能跳跃式获取)。(但)在同一行中,列值的访问却是随意的:可以通过列的位置或者名称。通过列的名称访问列值让代码更清晰,而通过位置访问列值则更高效。

    列的名称通过SQL语句的AS子名设定,如果SQL语句中没有使用AS子名,列的名称默认为数据表中对应的列名。例如对于"SELECT CityName AS CN FROM City",CN就是结果集中列的名称。
    在ResultSet中的数据,可以通过getXX系列方法来获取,例如:getString(), getInt(),"XX"取决于数据的类型。next()与previous()使游标移到结果集中的下一条或上一条记录。
    Statement执行SQL语句返回ResultSet对象后,ResultSet就变成一个独立的对象,与原先的Statement再也没有联系,即使Statement对象关闭,重新执行其他sql语句,或者获取多个结果集中的下一个。ResultSet将一直有效,除非显式或隐式地将其关闭。


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;
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值