理解第一个MySQL的C++程序

       说来汗颜,学了数据库原理课程,知道一堆查询语言操作、范式和事务处理等,但是竟然没有具体使用一个数据库。到网上查了一个基本的使用c++操作MySQL的范例,跑通这个范例,也大概了解了下如何配置环境和熟悉了下MySQL Connector/C++。  这篇博文写的很好  MySQL Connector/C++入门教程(上)

一、VS08连接MySQL的配置

1、新建C++项目,包含头文件

2、在项目->属性->C/C++->常规->附加目录 中添加包含各种头文件的目录,在MySQL Connector/C++的安装目录下(E:\Program Files\MySQL\Connector C++ 1.1.0),include目录其下包含了两个常用的头文件(mysql-connection.h / mysql-driver.h),另外其目录下的cppconn文件夹则包含了更多的头文件,把这些包含有各种头文件的目录全部添加到VC的附加目录中(E:\Program Files\MySQL\Connector C++ 1.1.0\include // E:\Program Files\MySQL\Connector C++ 1.1.0\include\cppconn)。有个问题是范例在运行时提示没有sqlstring.h这个头文件,前面包含的目录中也确实没有这个头文件。网上查了有这个头文件下载,添加到上面含有各种头文件的目录中即可;另外一个问题是提示找到不到boost类库,网上也有这个类库(比较大),下载后将其位置(D:\Program Files\boost\boost_1_51)添加到 附加目录中即可;

3、在项目->属性->链接器->常规->附加库目录 中添加包含各种库(lib)的目录,同上面加入这两个目录(E:\Program Files\MySQL\Connector C++ 1.1.0\lib\opt // E:\Program Files\MySQL\Connector C++ 1.1.0\lib\debug)即可;但在运行范例时提示无法启动程序,丢失libmysql.dll

4、在项目->属性->链接器->常规->输入 中添加 附加依赖项,加入上面lib中的两个库文件(mysqlcppconn.lib // mysqlcppconn-static.lib);

5、将上面lib下的 mysqlcppconn.dll 和MySQL serve中的lib下(E:\Program Files\MySQL\MySQL Server 5.5\lib)的libmysql.dll 这两个动态链接库添加到windows/system32目录下;否则运行时会提示丢失dll;


二、范例概述

网上找的范例

#include "stdafx.h"
#include 
#include 
#include 

using namespace sql;
using namespace std;
using namespace mysql;

void RunConnectMySQL() 
{
	//MySQL_Driver *driver;
	mysql::MySQL_Driver *driver;	
	Connection *con;
	Statement *state;
	ResultSet *result;

	// 初始化驱动
	driver = sql::mysql::get_mysql_driver_instance();
	//driver = get_mysql_driver_instance();
	// 建立链接
	con = driver->connect("tcp://127.0.0.1:3306", "root", "whu");

	state = con->createStatement();
	state->execute("use test");
	// 查询
	result = state->executeQuery("select * from testusr where id > 1002");
	// 输出查询
	while(result->next())
	{
		int id = result->getInt("id");
		//string name = result->getString("name");
		//cout << id << " : " << name << endl;
		cout << id << endl;
	}
	delete state;
	delete con;
}
int main()
{
	RunConnectMySQL();
	getchar();
	return 0;
}

根据前面的博文知道,MySQL Connector/C++遵循JDBC规范,实现了下面这些类:

  • Driver
  • Connection
  • Statement
  • PreparedStatement
  • ResultSet
  • Savepoint
  • DatabaseMetaData
  • ResultSetMetaData
  • ParameterMetaData
    Connector/C++可用于连接MySQL5.1及其以后版本。在MySQL Connector/C++发布之前,C++程序员可以使用MySQL C API或者MySQL++访问MySQL。前者是非标准、过程化的C API,后者是对MySQL C API的C++封装。


三、范例程序理解

1、建立数据库连接

      根据前面的博客知,范例定义了四个对象指针(四个类分别是Driver或者MySQL_Driver、Connection、Statement、ResultSet)。 sql::Connection代表到数据库的连接,可以通过sql::Driver来创建。sql::mysql::get_mysql_driver_instance()方法用于获取sql::Driver,通过调用sql::Driver::connect方法来创建sql::Connection对象。

Driver类重载了connect方法,一个接收数据库地址的url、用户名和密码的字符串,后一个接收一个map,map中以key/value的形式包含数据库地址、用户名与密码。使用TCP/IP连接到MySql服务器的url字符串的格式如下:"tcp://[hostname[:port]][/schemaname]"。例如:tcp://127.0.0.1:5555/some_scehma。hostname和端口号是可选的,如果省略,默认是127.0.0.1与3306。如果hostname为"localhost",会被自动转换为"127.0.0.1"。schemaname也是可选的,如果连接字符串中没有设置schema,需要在程序中通过Connection::setSchema方法手动设置。

这样初始化和链接的工作就已经完成:


//定义对象指针
//MySQL_Driver *driver; 
Driver *driver;
Connection *con;
// 初始化驱动
	driver = sql::mysql::get_mysql_driver_instance();
	//driver = get_mysql_driver_instance();
// 建立链接
	con = driver->connect("tcp://127.0.0.1:3306", "root", "whuhwq");

2、获取Statement对象
Statement对象用于向MySQL服务器发送SQL语句。该对象可以通过调用Connection::createStatement方法获得。Statement向MySQL发送一个静态的SQL语句,然后从
MySQL获取操作的结果,我们无法向它提供sql参数。如果要向它传递参数,可以使用PreparedStatemenet类。如果相同的SQL语句(只SQL参数不同)要被执行多次,建议使用PreparedStatement类。
Connection *con;
Statement *state;
state = con->createStatement();

3、执行SQL语句
在执行SQL语句之前应该通过Connection对象的setSchema方法设置相应的Schema(如果没有在数据库地址URL中指定schema)【也可以用execute代替】。
Statement::executeQuery用于执行一个Select语句,它返回ResultSet对象。Statement::executeUpdate方法主要用于执行INSERT, UPDATE, DELETE语(executeUpdate可以执行所有的SQL语句,如DDL语句,像创建数据表。),该方法返回受影响记录的条数。   如果你不清楚要执行的是像select这样的查询语句还是像update/insert/delete这样的操作语句,可以使用execute方法。对于查询语句,execute()返回True,然后通过getResultSet方法获取查询的结果;对于操作语句,它返回False,通过getUpdateCount方法获取受影响记录的数量。
ResultSet *result;
Statement *state;
	state->execute("use test");
// 查询
	result = state->executeQuery("select * from testusr where id > 1002"); //返回ResultSet对象

4、从ResultData总获取数据
上面的段落介绍了执行SQL查询的方法:executeQuery和execute,用于获取ResultSet对象。我们可以通过ResultSet访问查询的结果。每一个ResultSet都包含一个游
标(cursor),它指向数据集中的当前记录行。ResultSet中排列的记录是有序的(译者注:只能按顺序一条一条获取,不能跳跃式获取)。(但)在同一行中,列值的访问却是随意的:可以通过列的位置或者名称。通过列的名称访问列值让代码更清晰,而通过位置访问列值则更高效。
      在ResultSet中的数据,可以通过getXX系列方法来获取,例如:getString(), getInt(),"XX"取决于数据的类型。next()与previous()使游标移到结果集中的下一条或上一条记录。Statement执行SQL语句返回ResultSet对象后,ResultSet就变成一个独立的对象,与原先的Statement再也没有联系,即使Statement对象关闭,重新执行其他sql语句,或者获取多个结果集中的下一个。ResultSet将一直有效,除非显式或隐式地将其关闭。
ResultSet *result;
int id = result->getInt("id");

5、注意事项
  另外对于 像Connection这样的对象,必须在用完之后,显式的delete。
Connection *con;
Statement *state;
 delete state;delete con;



你可能感兴趣的:(知识学习)