MySQL连接器/ c++
MySQL连接器库,适用于C和c++应用程序
基于JDBC4的Connector/ c++ 8.0遗留c++ API

Connector/ c++ 8.0支持基于JDBC4规范的遗留c++ API。

这使得使用Connector/ c++ 1.1版本的应用程序可以轻松迁移到Connector/ c++ 8.0版本。

关于遗留c++ API的更详细信息可以在X MySQL连接器/ c++开发指南MySQL在线手册。

使用Connector/ c++和遗留c++ API的示例代码

下面的代码演示了如何使用遗留的c++ API连接到MySQL服务器。

请注意
连接是在遗留协议上建立的,因此不需要X Plugin,服务器也不需要支持X协议。

建立连接后,代码执行一个简单的SQL语句并从服务器读取结果。源文件可以在testapp/jdbc_test中找到。cc在Connector/ c++ 8.0的源分发版中。看到使用Connector/ c++ 8.0有关如何构建示例代码的说明。

每个使用遗留c++ API的程序都必须包含这个头文件:

# include < mysql / jdbc.h >

为连接、处理命令行参数和其他管理定义凭据:

#定义DEFAULT_URI "tcp://127.0.0.1"
#定义root用户
#定义EXAMPLE_PASS "
#define EXAMPLE_DB "test"
使用命名空间性病;
/*
驱动程序、连接、(简单)语句、结果集的使用示例
* /
int主要(int命令行参数个数,常量 字符* * argv)
常量 字符*url = (argc > 1 ?argv[1]: DEFAULT_URI;
常量 字符串用户(argc >= 3 ?argv[2]: EXAMPLE_USER);
常量 字符串Pass (argc >= 4 ?argv[3]: EXAMPLE_PASS);
常量 字符串数据库(argc >= 5 ?argv[4]: EXAMPLE_DB);
Cout << endl;
cout < <连接器/ c++独立程序示例…< < endl;
Cout << endl;
试一试

的实例来建立到MySQL服务器的连接sql:连接从一个sql: mysql:: MySQL_Driver对象。一个sql: mysql:: MySQL_Driver对象返回。sql:: mysql:: get_mysql_driver_instance ()

sql::Driver * Driver = sql::mysql::get_driver_instance();
/*使用驱动程序创建连接*/
cout < <“在上创建会话”<< url <<“…”
<< endl << endl;
std::unique_ptr< sql::Connection >
Con(驱动->连接(url,用户,通过));

确保你的自由骗子,那个sql:连接只要你不再需要它,就拒绝它。但不显式释放驱动程序、连接器对象。Connector/ c++负责释放它。

请注意
get_mysql_driver_instance ()调用get_driver_instance (),这不是线程安全的。要么避免从多个线程中同时调用这些方法,要么用互斥锁将这些调用包围起来,以防止在多个线程中同时执行。

这些方法可以用来检查连接状态或重新连接:

  • 连接sql:::: isValid ()检查连接是否存在
  • sql:连接:连接()如果连接已断开,则重新连接

sql:连接用于设置模式和创建语句:

con - > setSchema(数据库);
std::unique_ptr< sql::语句> stmt(con->createStatement());

要运行简单的查询,可以使用sql::声明::execute ()sql::声明::executeQuery (),sql::声明::executeUpdate ()方法。使用方法sql::声明::execute ()如果你的查询没有返回一个结果集,或者你的查询返回多个结果集:

std::unique_ptr< sql::ResultSet >
res(支撑- > executeQuery ("SELECT 'Welcome to Connector/ c++ ' AS _message"));
请注意
Statement和ResultSet对象是临时的,但它们是动态分配的。因此,当不再需要时,我们使用std::unique_ptr<>来释放内存。

获取结果集的API对于(简单)语句和准备语句是相同的。如果查询返回一个结果集,则使用sql::声明::executeQuery ()sql:: PreparedStatement:: executeQuery ()运行您的查询。两个方法都返回sql:结果集对象。默认情况下,Connector/ c++会缓冲客户机上的所有结果集,以支持游标。

下面的代码一行一行地遍历整个结果集sql::结果集::next ()方法,该方法返回真正的如果成功读取了行。否则它会返回,这意味着我们到达了结果集的末尾,没有更多的行要读了。

实际数据是通过getXxxx()函数获得的,例如getInt (), getString ()等。可以按照结果集中从1开始的顺序用数字对列进行索引。另外,列名也可以用作字符串索引。

(res - > next ())
cout < <“\ t…MySQL回复:"< < res - > getString (“_message”) << endl;
cout < <“\ t…再说一遍,MySQL。”< < endl;
cout < <“\ t…MySQL回复:"<< res->getString(1) << endl;

错误处理是通过标准的try/catch块完成的:

(sql:: SQLException & e)
/*
JDBC API抛出三种不同的异常:
- sql::MethodNotImplementedException(派生自sql::SQLException)
- sql::InvalidArgumentException(派生自sql::SQLException)
- sql::SQLException(派生自std::runtime_error)
* /
cout < <"# ERR: SQLException in "< < __FILE__;
cout < <"("<<“EXAMPLE_FUNCTION”<<")上线"<< __LINE__ << endl;
/*使用what()(派生自std::runtime_error)获取错误消息*/
cout < <# err: "< < e.what ();
cout < <MySQL错误代码:< < e.getErrorCode ();
cout < <SQLState: "<< e.getSQLState() <<“)”< < endl;
返回EXIT_FAILURE;

以下是遗留c++ API的测试示例的完整c++代码:

/*
*版权(c) 2008年,2020年,Oracle和/或其附属公司。
*本程序是免费软件;您可以重新分发它和/或修改它
*它根据GNU通用公共许可证的条款,版本2.0,作为
*由自由软件基金会出版。
*此程序也与某些软件(包括
*但不限于在单独条款下授权的OpenSSL),
*在特定文件或组件或包含的许可证中指定
*文10bet官方网站档。MySQL的作者在此授予您一个
*附加许可链接程序和您的衍生作品
*使用他们附带的独立授权软件
* MySQL。
*在不限制前述内容的前提下,此文件,
*是MySQL Connector/ c++的一部分,也受
*通用自由/开源软件例外,版本1.0,可以在
* http://oss.oracle.com/licenses/universal-foss-exception。
*发布这个程序是希望它会有用,但是
*无任何保证;甚至没有隐含的保证
*适销性或适合某一特定用途。
*参见GNU通用公共许可证2.0版本了解更多细节。
*您应该已经收到GNU通用公共许可证的副本
*随此程序;如果没有,就写信给自由软件基金会,
*美国波士顿富兰克林街5楼51号邮编:MA 02110-1301
* /
/*
使用连接器/ c++的JDBC API的应用程序的基本示例
* /
/*标准c++包含*/
# include < stdlib.h >
# include < iostream >
# include < sstream >
# include < stdexcept >
# include <记忆>
# include < mysql / jdbc.h >
#定义DEFAULT_URI "tcp://127.0.0.1"
#定义root用户
#定义EXAMPLE_PASS "
#define EXAMPLE_DB "test"
使用命名空间性病;
/*
驱动程序、连接、(简单)语句、结果集的使用示例
* /
int主要(int命令行参数个数,常量 字符* * argv)
常量 字符*url = (argc > 1 ?argv[1]: DEFAULT_URI;
常量 字符串用户(argc >= 3 ?argv[2]: EXAMPLE_USER);
常量 字符串Pass (argc >= 4 ?argv[3]: EXAMPLE_PASS);
常量 字符串数据库(argc >= 5 ?argv[4]: EXAMPLE_DB);
Cout << endl;
cout < <连接器/ c++独立程序示例…< < endl;
Cout << endl;
试一试
sql::Driver * Driver = sql::mysql::get_driver_instance();
/*使用驱动程序创建连接*/
cout < <“在上创建会话”<< url <<“…”
<< endl << endl;
std::unique_ptr< sql::Connection >
Con(驱动->连接(url,用户,通过));
con - > setSchema(数据库);
std::unique_ptr< sql::语句> stmt(con->createStatement());
std::unique_ptr< sql::ResultSet >
res(支撑- > executeQuery ("SELECT 'Welcome to Connector/ c++ ' AS _message"));
cout < <“\ t…运行'SELECT 'Welcome to Connector/ c++ ' AS _message'"
< < endl;
(res - > next ())
cout < <“\ t…MySQL回复:"< < res - > getString (“_message”) << endl;
cout < <“\ t…再说一遍,MySQL。”< < endl;
cout < <“\ t…MySQL回复:"<< res->getString(1) << endl;
(sql:: SQLException & e)
/*
JDBC API抛出三种不同的异常:
- sql::MethodNotImplementedException(派生自sql::SQLException)
- sql::InvalidArgumentException(派生自sql::SQLException)
- sql::SQLException(派生自std::runtime_error)
* /
cout < <"# ERR: SQLException in "< < __FILE__;
cout < <"("<<“EXAMPLE_FUNCTION”<<")上线"<< __LINE__ << endl;
/*使用what()(派生自std::runtime_error)获取错误消息*/
cout < <# err: "< < e.what ();
cout < <MySQL错误代码:< < e.getErrorCode ();
cout < <SQLState: "<< e.getSQLState() <<“)”< < endl;
返回EXIT_FAILURE;
Cout << endl;
cout < <“…更多信息请访问http://www.mysql.10bet靠谱com。”< < endl;
Cout << endl;
返回EXIT_SUCCESS;