c++连接MySQL有两种方式,1是原始的方法,2是用 Connector c++ 。Connector c++  只是一种封装,使之更加方便。

1、原始方法

这里归纳了C API可使用的函数,并在下一节详细介绍了它们。
 

函数

描述

mysql_affected_rows()

返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。

mysql_autocommit()

切换 autocommit模式,ON/OFF

mysql_change_user()

更改打开连接上的用户和数据库

mysql_charset_name()

返回用于连接的默认字符集的名称。

mysql_close()

关闭服务器连接。

mysql_commit()

提交事务。

mysql_connect()

连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。

mysql_create_db()

创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。

mysql_data_seek()

在查询结果集中查找属性行编号。

mysql_debug()

用给定的字符串执行DBUG_PUSH。

mysql_drop_db()

撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。

mysql_dump_debug_info()

让服务器将调试信息写入日志。

mysql_eof()

确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。

mysql_errno()

返回上次调用的MySQL函数的错误编号。

mysql_error()

返回上次调用的MySQL函数的错误消息。

mysql_escape_string()

为了用在SQL语句中,对特殊字符进行转义处理。

mysql_fetch_field()

返回下一个表字段的类型。

mysql_fetch_field_direct()

给定字段编号,返回表字段的类型。

mysql_fetch_fields()

返回所有字段结构的数组。

mysql_fetch_lengths()

返回当前行中所有列的长度。

mysql_fetch_row()

从结果集中获取下一行

mysql_field_seek()

将列光标置于指定的列。

mysql_field_count()

返回上次执行语句的结果列的数目。

mysql_field_tell()

返回上次mysql_fetch_field()所使用字段光标的位置。

mysql_free_result()

释放结果集使用的内存。

mysql_get_client_info()

以字符串形式返回客户端版本信息。

mysql_get_client_version()

以整数形式返回客户端版本信息。

mysql_get_host_info()

返回描述连接的字符串。

mysql_get_server_version()

以整数形式返回服务器的版本号。

mysql_get_proto_info()

返回连接所使用的协议版本。

mysql_get_server_info()

返回服务器的版本号。

mysql_info()

返回关于最近所执行查询的信息。

mysql_init()

获取或初始化MYSQL结构。

mysql_insert_id()

返回上一个查询为AUTO_INCREMENT列生成的ID。

mysql_kill()

杀死给定的线程。

mysql_library_end()

最终确定MySQL C API库。

mysql_library_init()

初始化MySQL C API库。

mysql_list_dbs()

返回与简单正则表达式匹配的数据库名称。

mysql_list_fields()

返回与简单正则表达式匹配的字段名称。

mysql_list_processes()

返回当前服务器线程的列表。

mysql_list_tables()

返回与简单正则表达式匹配的表名。

mysql_more_results()

检查是否还存在其他结果。

mysql_next_result()

在多语句执行过程中返回/初始化下一个结果。

mysql_num_fields()

返回结果集中的列数。

mysql_num_rows()

返回结果集中的行数。

mysql_options()

为mysql_connect()设置连接选项。

mysql_ping()

检查与服务器的连接是否工作,如有必要重新连接。

mysql_query()

执行指定为“以Null终结的字符串”的SQL查询。

mysql_real_connect()

连接到MySQL服务器。

mysql_real_escape_string()

考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。

mysql_real_query()

执行指定为计数字符串的SQL查询。

mysql_refresh()

刷新或复位表和高速缓冲。

mysql_reload()

通知服务器再次加载授权表。

mysql_rollback()

回滚事务。

mysql_row_seek()

使用从mysql_row_tell()返回的值,查找结果集中的行偏移。

mysql_row_tell()

返回行光标位置。

mysql_select_db()

选择数据库。

mysql_server_end()

最终确定嵌入式服务器库。

mysql_server_init()

初始化嵌入式服务器库。

mysql_set_server_option()

为连接设置选项(如多语句)。

mysql_sqlstate()

返回关于上一个错误的SQLSTATE错误代码。

mysql_shutdown()

关闭数据库服务器。

mysql_stat()

以字符串形式返回服务器状态。

mysql_store_result()

检索完整的结果集至客户端。

mysql_thread_id()

返回当前线程ID。

mysql_thread_safe()

如果客户端已编译为线程安全的,返回1。

mysql_use_result()

初始化逐行的结果集检索。

mysql_warning_count()

返回上一个SQL语句的告警数。

与MySQL交互时,应用程序应使用该一般性原则:

1.    通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。

2.    通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。

3.    发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。

4.    通过调用mysql_close(),关闭与MySQL服务器的连接。

5.    通过调用mysql_library_end(),结束MySQL库的使用。

调用mysql_library_init()和mysql_library_end()的目的在于,为MySQL库提供恰当的初始化和结束处理。对于与客户端库链接的应用程序,它们提供了改进的内存管理功能。如果不调用mysql_library_end(),内存块仍将保持分配状态(这不会增加应用程序使用的内存量,但某些内存泄漏检测器将抗议它)。对于与嵌入式服务器链接的应用程序,这些调用会启动并停止服务器。

mysql_library_init()和mysql_library_end()实际上是#define符号,这类符号使得它们等效于mysql_server_init()和mysql_server_end(),但其名称更清楚地指明,无论应用程序使用的是mysqlclient或mysqld库,启动或结束MySQL库时,应调用它们。对于早期的MySQL版本,可调用mysql_server_init()和mysql_server_end()取而代之。

如果愿意,可省略对mysql_library_init()的调用,这是因为,必要时,mysql_init()会自动调用它。

要想连接到服务器,可调用mysql_init()来初始化连接处理程序,然后用该处理程序(以及其他信息,如主机名、用户名和密码)调用mysql_real_connect()。建立连接后,在低于5.0.3版的API中,mysql_real_connect()会将再连接标志(MYSQL结构的一部分)设置为1,或在较新的版本中,将其设置为0。对于该标志,值“1”指明,如果因连接丢失而无法执行语句,放弃之前,会尝试再次连接到服务器。从MySQL 5.0.13开始,可以在mysql_options()上使用MYSQL_OPT_RECONNECT选项,以控制再连接行为。完成连接后,调用mysql_close()中止它。

当连接处于活动状态时,客户端或许会使用mysql_query()或mysql_real_query()向服务器发出SQL查询。两者的差别在于,mysql_query()预期的查询为指定的、由Null终结的字符串,而mysql_real_query()预期的是计数字符串。如果字符串包含二进制数据(其中可能包含Null字节),就必须使用mysql_real_query()。

对于每个非SELECT查询(例如INSERT、UPDATE、DELETE),通过调用mysql_affected_rows(),可发现有多少行已被改变(影响)。

对于SELECT查询,能够检索作为结果集的行。注意,某些语句因其返回行,类似与SELECT。包括SHOW、DESCRIBE和EXPLAIN。应按照对待SELECT语句的方式处理它们。

客户端处理结果集的方式有两种。一种方式是,通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。第二种方式是针对客户端的,通过调用mysql_use_result(),对“按行”结果集检索进行初始化处理。该函数能初始化检索结果,但不能从服务器获得任何实际行。

在这两种情况下,均能通过调用mysql_fetch_row()访问行。通过mysql_store_result(),mysql_fetch_row()能够访问以前从服务器获得的行。通过mysql_use_result(),mysql_fetch_row()能够实际地检索来自服务器的行。通过调用mysql_fetch_lengths(),能获得关于各行中数据大小的信息。

完成结果集操作后,请调用mysql_free_result()释放结果集使用的内存。

这两种检索机制是互补的。客户端程序应选择最能满足其要求的方法。实际上,客户端最常使用的是mysql_store_result()。

mysql_store_result()的1个优点在于,由于将行全部提取到了客户端上,你不仅能连续访问行,还能使用mysql_data_seek()或mysql_row_seek()在结果集中向前或向后移动,以更改结果集内当前行的位置。通过调用mysql_num_rows(),还能发现有多少行。另一方面,对于大的结果集,mysql_store_result()所需的内存可能会很大,你很可能遇到内存溢出状况。

mysql_use_result()的1个优点在于,客户端所需的用于结果集的内存较少,原因在于,一次它仅维护一行(由于分配开销较低,mysql_use_result()能更快)。它的缺点在于,你必须快速处理每一行以避免妨碍服务器,你不能随机访问结果集中的行(只能连续访问行),你不知道结果集中有多少行,直至全部检索了它们为止。不仅如此,即使在检索过程中你判定已找到所寻找的信息,也必须检索所有的行。

通过API,客户端能够恰当地对查询作出响应(仅在必要时检索行),而无需知道查询是否是SELECT查询。可以在每次mysql_query()或mysql_real_query()后,通过调用mysql_store_result()完成该操作。如果结果集调用成功,查询为SELECT,而且能够读取行。如果结果集调用失败,可调用mysql_field_count()来判断结果是否的确是所预期的。如果mysql_field_count()返回0,查询不返回数据(表明它是INSERT、UPDATE、DELETE等),而且不返回行。如果mysql_field_count()是非0值,查询应返回行,但没有返回行。这表明查询是失败了的SELECT。关于如何实现该操作的示例,请参见关于mysql_field_count()的介绍。

无论是mysql_store_result()还是mysql_use_result(),均允许你获取关于构成结果集的字段的信息(字段数目,它们的名称和类型等)。通过重复调用mysql_fetch_field(),可以按顺序访问行内的字段信息,或者,通过调用mysql_fetch_field_direct(),能够在行内按字段编号访问字段信息。通过调用mysql_field_seek(),可以改变当前字段的光标位置。对字段光标的设置将影响后续的mysql_fetch_field()调用。此外,你也能通过调用mysql_fetch_fields(),一次性地获得关于字段的所有信息。

为了检测和通报错误,MySQL提供了使用mysql_errno()和mysql_error()函数访问错误信息的机制。它们能返回关于最近调用的函数的错误代码或错误消息,最近调用的函数可能成功也可能失败,这样,你就能判断错误是在何时出现的,以及错误是什么。

MYSQL
这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL 函数。
MYSQL_RES
这个结构代表返回行的一个查询的(SELECT , SHOW , DESCRIBE ,EXPLAIN )的结果。从查询返回的信息在本章下文称为结果集合 。
MYSQL_ROW
这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用mysql_fetch_row() 获得。
MYSQL_FIELD
这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field() 对每一列获得MYSQL_FIELD 结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW 结构中。
MYSQL_FIELD_OFFSET
这是一个相对一个MySQL 字段表的偏移量的类型安全的表示。(由mysql_field_seek() 使用。) 偏移量是在一行以内的字段编号,从0开始。
my_ulonglong
该类型用于行编号和mysql_affected_rows() 、mysql_num_rows() 和mysql_insert_id() 。这种类型提供0 到1.84e19 的一个范围。在一些系统上,试图打印类型my_ulonglong 的值将不工作。为了打印出这样的值,将它变换到unsigned long 并且使用一个%lu 打印格式。例如:

printf (Number of rows: %lu/n", (unsigned long) mysql_num_rows(result));

MYSQL_FIELD结构包含列在下面的成员:

char * name
字段名,是一个空结尾的字符串。
char * table
包含该字段的表的名字,如果它不是可计算的字段。对可计算的字段,table 值是一个空字符串。
char * def
这字段的缺省值,是一个空结尾的字符串。只要你使用,只有你使用mysql_list_fields() 才可设置它。
enum enum_field_types type
字段类型。type 值可以是下列之一:

类型值 类型含义
FIELD_TYPE_TINY TINYINT 字段
FIELD_TYPE_SHORT SMALLINT 字段
FIELD_TYPE_LONG INTEGER 字段
FIELD_TYPE_INT24 MEDIUMINT 字段
FIELD_TYPE_LONGLONG BIGINT 字段
FIELD_TYPE_DECIMAL DECIMAL 或NUMERIC 字段
FIELD_TYPE_FLOAT FLOAT 字段
FIELD_TYPE_DOUBLE DOUBLE 或REAL 字段
FIELD_TYPE_TIMESTAMP TIMESTAMP 字段
FIELD_TYPE_DATE DATE 字段
FIELD_TYPE_TIME TIME 字段
FIELD_TYPE_DATETIME DATETIME 字段
FIELD_TYPE_YEAR YEAR 字段
FIELD_TYPE_STRING 字符串(CHAR 或VARCHAR )字段
FIELD_TYPE_BLOB BLOB 或TEXT 字段(使用max_length 决定最大长度)
FIELD_TYPE_SET SET 字段
FIELD_TYPE_ENUM ENUM 字段
FIELD_TYPE_NULL NULL - 类型字段
FIELD_TYPE_CHAR 不推荐;使用FIELD_TYPE_TINY 代替

你可以使用IS_NUM() 宏来测试字段是否有一种数字类型。将type 值传给IS_NUM() 并且如果字段是数字的,它将计算为TRUE:

if (IS_NUM(field->type))
printf("Field is numeric/n");
unsigned int length
字段宽度,在表定义中指定。
unsigned int max_length
对结果集合的字段的最大宽度(对实际在结果集合中的行的最长字段值的长度)。如果你使用mysql_store_result() 或mysql_list_fields() ,这包含字段最大长度。如果你使用mysql_use_result() ,这个变量的值是零。
unsigned int flags
字段的不同位标志。flags 值可以是零个或多个下列位设置:

标志值 标志含义
NOT_NULL_FLAG 字段不能是NULL
PRI_KEY_FLAG 字段是一个主键的一部分
UNIQUE_KEY_FLAG 字段是一个唯一键的一部分
MULTIPLE_KEY_FLAG 字段是一个非唯一键的一部分。
UNSIGNED_FLAG 字段有UNSIGNED 属性
ZEROFILL_FLAG 字段有ZEROFILL 属性
BINARY_FLAG 字段有BINARY 属性
AUTO_INCREMENT_FLAG 字段有AUTO_INCREMENT 属性
ENUM_FLAG 字段是一个ENUM (不推荐)
BLOB_FLAG 字段是一个BLOB 或TEXT (不推荐)
TIMESTAMP_FLAG 字段是一个TIMESTAMP (不推荐)

BLOB_FLAG 、ENUM_FLAG 和TIMESTAMP_FLAG 标志的使用是不推荐的,因为他们指出字段的类型而非它的类型属性。对FIELD_TYPE_BLOB 、FIELD_TYPE_ENUM 或FIELD_TYPE_TIMESTAMP ,最好是测试field->type 。下面例子演示了一个典型的flags 值用法:

if (field->flags & NOT_NULL_FLAG)
printf("Field can't be null/n");

你可以使用下列方便的宏决来确定flags 值的布尔状态:

IS_NOT_NULL(flags) 真,如果该字段被定义为NOT NULL
IS_PRI_KEY(flags) 真,如果该字段是一个主键
IS_BLOB(flags) 真,如果该字段是一个BLOB 或TEXT (不推荐;相反测试field->type )
unsigned int decimals
对数字字段的小数位数。  

mysql_fetch_field ()

MYSQL_FIELD *mysql_fetch_field (MYSQL_RES *result)
1 说明

返回作为一个MYSQL_FIELD 结构的一个结果集合的一个列的定义。重复调用这个函数在结果集合中检索所有关于列的信息。当没有剩下更多的字段时,mysql_fetch_field () 返回NULL 。

在每次你执行一个新的SELECT 查询,mysql_fetch_field () 被重置(reset)以返回有关第一列的信息。由mysql_fetch_field () 返回的字段也受调用mysql_field_seek() 的影响。

如果你调用mysql_query() 在一张表上执行一个SELECT ,但是没调用mysql_store_result() ,如果你调用mysql_fetch_field () 询问一个BLOB 字段的长度,MySQL 返回缺省BLOB长度(8K字节)。(选择8K的长度是因为MySQL 不知道BLOB 的最大长度。这应该在某个时候是它可配置) 一旦你已经检索了结果集合,field->max_length 包含了在特定查询中对于该列最大值的长度。
2 返回值

当前列的MYSQL_FIELD 结构。如果没有列剩下,NULL 。
3 错误

无。
4 范例

MYSQL_FIELD *field;

while((field = mysql_fetch_field
(result)))
{
printf("field name %s/n", field->name);
}

mysql_fetch_fields()

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 
1 说明

返回一个结果集合的所有MYSQL_FIELD 结构的数组。每个结构提供结果结合中一列的字段定义。 
2 返回值

一个结果集合的所有MYSQL_FIELD 结构的一个数组。
3 错误

无。 
4 范例

unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields; num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
printf("Field %u is %s/n", i, fields[i].name);
}

示例2

不想用ODBC什么的连接数据库,想直接用MySQL提供的接口连接数据库。我用的是VS2005。
网上的一些介绍都是修改项目属性等的设置,我不喜欢那样。首先 我们需要的文件有mysql.h   my_alloc.h   my_list.h   mysql_com.h   mysql_time.h   mysql_version.h   typelib.h  以及libmysql.lib和libmysql.dll全拷到项目文件夹下。 以上提到的文件都在MySQL安装目录下,比如我的是:C:\Program Files\MySQL\MySQL Server 5.5。.h文件在include目录下;  .lib和.dll文件在lib目录下。
准备好后,首先包含头文件和链接MySQL库,这里要注意不要忘记包含winsock.h,这是连接数据库必须的,从WorkBench连接数据库时弹出的对话框可以看出是通过TCP连接的。
 
#include "mysql.h"
#include <winsock.h>
#pragma comment(lib, "libmysql.lib")

定义两个MYSQL结构体变量
MYSQL mysql, *sock;
下面是初始化连接
mysql_init(&mysql);
主要给结构体内的元素赋初值。
接下来是真正的连接
mysql_real_connect(&mysql, "localhost", "USERNAME", "PASSWORD", "DBNAME", NULL, 0, NULL);
第一个参数不说了;第二个参数是数据库所在的主机地址;第三、四个参数是用户名、密码;第五个参数是要连接的数据库名称;第六个参数是端口号,可以指定也可以赋为0;第七个参数是指定连接的套接字,也不用管;第八个参数一般情况下都是0。
注意函数的返回值和PHP的不一样。连接成功返回0,否则返回非0。出错信息可以调用sql_error(MYSQL* )来查看。
定义sql语句(最后没有分号):
char sqlbuf[100] = "SELECT Device_Route FROM Device";
下面让MySQL执行sql语句:
mysql_query(sock, sqlbuf); 
该函数也是成功(即使没有查询到数据)返回0,失败返回非0。
查询到了数据后就是获取查询结果了,这里还要定义两个结构体:查询结果结构体和记录结构体(保存一条记录)
MYSQL_RES *res;
MYSQL_ROW row;  // 本质上就是二维数组
获取查询结果
res = mysql_store_result(sock);
获取每一条记录
while (row = mysql_fetch_row(res))
{
        // 添加自己的存储查询结果代码
}
释放查询结果:
mysql_free_result(res);
关闭MySQL连接:
mysql_close(sock);
sock = NULL;
如果是INSERT、UPDATE等非查询语句到mysql_query()就可以结束了,因为没有结果可存。
完整的实现如下:

  1. #include "stdafx.h"
  2. #include <winsock.h>
  3. #include "mysql.h"
  4. #pragma comment(lib, "libmysql.lib")
  5. void main()
  6. {
  7. MYSQL mysql, *sock;
  8. mysql_init(&mysql);
  9. if (!(sock = mysql_real_connect(&mysql, "localhost", "root", "123456", "sw_pfc", 0, NULL, 0)))
  10. {
  11. printf("Cannot connect to database:%s\n",mysql_error(sock));
  12. return;
  13. }
  14. char sqlbuf[200] = "SELECT * FROM rpc";
  15. if (mysql_query(sock, sqlbuf))
  16. {
  17. printf("Query Failed:%s", mysql_error(sock));
  18. return;
  19. }
  20. MYSQL_RES *result;
  21. unsigned uLine=0,uField=0;
  22. MYSQL_ROW row;
  23. //MYSQL_FIELD **pField;pField = NULL;
  24. MYSQL_FIELD *pField(NULL);
  25. unsigned long *lengths;
  26. if (!(result = mysql_store_result(sock)))
  27. {
  28. printf("Failed to store result:%s", mysql_error(sock));
  29. return;
  30. }
  31. //获得行数
  32. uLine=(unsigned)mysql_num_rows(result);
  33. //获得字段数
  34. uField=(unsigned)mysql_num_fields(result);
  35. //获得字段的相关信息
  36. //for(int j = 0; j < (int)uField; ++j)
  37. //{
  38. //  pField[j] =mysql_fetch_field_direct(result, j);
  39. //}
  40. pField = mysql_fetch_fields(result);
  41. //填充结果集
  42. for(int i=0;i<(int)uLine;i++)
  43. {
  44. //获得一行数据
  45. row=mysql_fetch_row(result);
  46. lengths = mysql_fetch_lengths(result);
  47. for(int j=0;j<(int)uField;j++)
  48. {
  49. //blob
  50. MYSQL_FIELD *pTemp = pField+j;
  51. if(pTemp->type == MYSQL_TYPE_BLOB)
  52. {
  53. //列名称
  54. printf("%s:%d--%d ", pTemp->name, lengths[j], pTemp->max_length);
  55. for(unsigned long nindex = 0; nindex < lengths[j]; ++nindex)
  56. {
  57. printf("%02X", row[j][nindex]);
  58. }
  59. }
  60. else
  61. {
  62. //列名称
  63. printf("%s:%d--%d %s", pTemp->name, lengths[j], pTemp->max_length, row[j]);
  64. }
  65. printf("\t");
  66. }
  67. printf("\n");
  68. }
  69. //if(pField) delete []pField;
  70. //释放结果集
  71. mysql_free_result(result);
  72. // 关闭数据库
  73. mysql_close(sock);
  74. }

2、用 Connector c++

首先去MySQL官网下载MySQL connector/C++
http://dev.mysql.com/downloads/connector/cpp/
根据自己系统平台下载相应的版本。文件夹名字太长,将“mysql-connector-c++-noinstall-1.0.5-win32”改为“mysql”。
下面要配置vs2008的环境。 
1. 项目属性页->C/C++->General->Additional Include Directories。将mysql\include目录添加进去。 
2. 项目属性页->Linker->General->Additional Library Directories。将mysql\lib与$MySQL\bin目录添加进去。
3. 项目属性页->Linker->Input->Additional Dependencies。添加这两项mysqlcppconn.lib,mysqlcppconn-static.lib(mysql\lib目录下的两个.lib文件)
4. 将mysql\lib下的mysqlcppconn.dll文件与$MySQL\bin\libmySQL.dll复制到windows\system32文件夹下。
环境配置完毕。
在连接数据库之前,先建立一张表。 (其实这些可以在代码中完成,我这样是为了让测试代码尽可能简练易查错)
打开控制台,输入mysql -u root -p,输入密码。
查看当前已有的数据库。(SQL语句末尾加上';'表示立即执行当前语句。)
mysql> show databases;
创建数据库
mysql> create database test;
使用数据库(这句不能加分号)
mysql> use test
查看已有的表
mysql> show tables;
创建表
mysql> create table testuser ( id INT, name CHAR(20));
插入数据
mysql> insert into testuser(id, name) values(1001, 'google');
mysql> insert into testuser(id, name) values(1002, 'kingsoft');
mysql> insert into testuser(id, name) values(1003, 'firefox');

  1. 现在在C++中查询这些数据
  2. 1.#include "stdafx.h"
  3. 2.#include <mysql_connection.h>
  4. 3.#include <mysql_driver.h>
  5. 4.#include <statement.h>
  6. 5.using namespace sql;
  7. 6.using namespace std;
  8. 7.void RunConnectMySQL()
  9. 8.{
  10. 9.    mysql::MySQL_Driver *driver;
  11. 10.    Connection *con;
  12. 11.    Statement *state;
  13. 12.    ResultSet *result;
  14. 13.    // 初始化驱动
  15. 14.    driver = sql::mysql::get_mysql_driver_instance();
  16. 15.    // 建立链接
  17. 16.    con = driver->connect("tcp://127.0.0.1:3306", "root", "123");
  18. 17.    state = con->createStatement();
  19. 18.    state->execute("use test");
  20. 19.    // 查询
  21. 20.    result = state->executeQuery("select * from testuser where id < 1002");
  22. 21.    // 输出查询
  23. 22.    while(result->next())
  24. 23.    {
  25. 24.        int id = result->getInt("ID");
  26. 25.        string name = result->getString("name");
  27. 26.        cout << id << " : " << name << endl;
  28. 27.    }
  29. 28.    delete state;
  30. 29.    delete con;
  31. 30.}
  32. 31.int _tmain(int argc, _TCHAR* argv[])
  33. 32.{
  34. 33.    RunConnectMySQL();
  35. 34.    getchar();
  36. 35.    return 0;
  37. 36.}

示例2

想写一个demo 测试一下。
mysql connector c++ 调用 方式 有两种,一种是动态链接库调用 ,一种是静态库调用。静态库试了一整天不行,都是以 get_mysql_driver_instance() 没有链接到而靠终,后来才知道 新版本的connector c++ 如果以静态方式调用的话是不再用这个函数了 可是官方文档中没有说不用get_mysql_driver_instance这个函数是怎么操作数据库的。静态失败了,搞动态吧。

动态库调用方式是若干 .h 文件和一个 mysqlcppconn.lib 链接之后在运行期间会调用mysqlcppconn.dll貌似运行期间还要调用  libmysql.dll 。

下面说步骤

1.首先把把connector c++ include文件夹 加到工程包含目录里

2.其次链接lib 其中分为debug版和 release 版

#ifdef _DEBUG
#pragma comment(lib,"..\\dynamic_lib\\Debug_\\mysqlcppconn.lib")
#else
#pragma comment(lib,"..\\dynamic_lib\\Release_\\mysqlcppconn.lib")
#endif // DEBUG

3.直接调用函数了 ,以下代码测试正确 vs2012 win7 64位

 
// TestMySql.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "mysql_connection.h"
#include "mysql_driver.h"
#include "mysql_error.h" #include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h> #include <iostream>
using namespace std; #ifdef _DEBUG
#pragma comment(lib,"..\\dynamic_lib\\Debug_\\mysqlcppconn.lib")
#else
#pragma comment(lib,"..\\dynamic_lib\\Release_\\mysqlcppconn.lib")
#endif // DEBUG int _tmain(int argc, _TCHAR* argv[])
{
sql::mysql::MySQL_Driver *driver = NULL;
sql::Connection *con = NULL;
driver = sql::mysql::get_mysql_driver_instance();
if(driver == NULL)
{
cout<<"driver is null"<<endl;
goto END;
}
con = driver->connect("tcp://localhost:3306", "root", "3342125");
if(con == NULL)
{
cout<<"conn is null"<<endl;
goto END;
} cout<<"连接数据库成功"<<endl; sql::Statement * stmt = NULL;
stmt = con->createStatement();
if(stmt == NULL)
{
cout<<"stmt is null"<<endl;
goto END;
}
stmt->execute("SET CHARSET GB2312");
stmt->execute("USE zhanbao");
sql::ResultSet * resultSet = stmt->executeQuery("这里写查询语句 ");
int i = 0;
while (resultSet->next()) {
cout << ", label = '" << resultSet->getString("ACCOUNT") << "'" << endl;
i++;
} cout<<"共"<<i<<"条"<<endl; con->close();
delete stmt;
delete con; END:
system("pause"); return 0;
}

C语言连接MySQL数据库(转)的更多相关文章

  1. C语言连接MySql数据库

    C语言连接MySql数据库(CodeBlocks) 操作系统:Windows7(32位)编译软件:Code::Blocks 10.05数 据 库:mysql-5.1.62-win32 数据库内的数据: ...

  2. Linux centos 7/ubantu下: 用 C 语言连接 MySQL数据库

    前言:最近用IPC.socket做ATM.聊天项目,考虑到需要用到数据库,所以总结一下centos.ubantu环境下怎么用C语言操作数据库,例如常见的增删改查等! 一.Centos环境安装mysql ...

  3. c语言连接mysql数据库的实现方法

    C语言连接mysql数据库,需要相应的头文件和lib文件,如果你安装Mysql数据库,会在安装目录下找到这些库文件,如果没有安装,也可以在网上找到 我这里也有一份网上找到的:/201205/other ...

  4. R语言-连接MySQL数据库方法

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   R语言连接数据库常用的方法有2种: 1.使用R数据库接口 连接MySQL,使用RMySQL包,使用前RMySQL包要先安 ...

  5. C语言连接MySQL数据库(课程设计总结)

    刚结束课程设计,也预示着假期立即就要到来了.本次课程设计并不算难,无非就是让做一个XXX系统,实现用户的注冊.登录.菜单管理.超级用户等等一些功能,到如今为止已经做过好几个了,所以基本流程都熟悉了! ...

  6. 通过Java语言连接mysql数据库

    1加载驱动 2创建链接对象 3创建语句传输对象 4接受结果集 5遍历 6关闭资源

  7. 用C语言操作MySQL数据库,进行连接、插入、修改、删除等操作

    C/C++ code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3 ...

  8. Linux下C语言连接MySQL

    本文出自   http://blog.csdn.net/shuangde800 首先保证安装: 1:安装MySQL:sudo apt-get install mysql-server mysql-cl ...

  9. C语言连接mysql -insert-update

    C语言连接mysql数据库实现insert语句:数据库:test表:systeminfo CREATE TABLE `systeminfo` (  `id` int(11) NOT NULL AUTO ...

随机推荐

  1. word2013怎样批量重设图片和大小?(转)

    https://www.zhihu.com/question/52908434/answer/132934213 点击视图,宏,查看宏,任意输入一个宏名,创建,清空框内内容,复制以下代码粘贴,保存. ...

  2. 【转】npm install、npm install --save与npm install --save-dev区别

    原文: https://blog.csdn.net/qq_30378229/article/details/78463930 ------------------------------------- ...

  3. wifidog接口文档(转)

    目录(?)[-] 网关心跳协议 请求信息 回复格式 例子 用户状态心跳协议 请求格式 注意 回复格式 状态码 例子 跳转协议 请求格式 例子 注册协议 请求格式 例子 wifidog是搭建无线热点认证 ...

  4. Is there anyway to discover which ip addresses are connected to the db?

    From mongo shell run db.currentOp() to show all active connections or db.currentOp(true) to show all ...

  5. 被查封7周之后,全球最大BT网站“海盗湾”又重新活过来了【36kr】

    原文地址 原文地址 "免费"和"版权","自由"和"监管"永远在较量啊,矛盾共同体,事物的两面性~ 被查封7周之后,全球 ...

  6. Ant详解之-path、classpath和fileset

    转自:http://www.cnblogs.com/itech/archive/2011/11/01/2231206.html 一 .<path/> 和 <classpath/> ...

  7. 机器学习-分类器-Adaboost原理

    Adaboost原理 Adaboost(AdaptiveBoosting)是一种迭代算法,通过对训练集不断训练弱分类器,然后把这些弱分类器集合起来,构成强分类器.adaboost算法训练的过程中,初始 ...

  8. hive中简单介绍分区表(partition table)——动态分区(dynamic partition)、静态分区(static partition)

    一.基本概念 hive中分区表分为:范围分区.列表分区.hash分区.混合分区等. 分区列:分区列不是表中的一个实际的字段,而是一个或者多个伪列.翻译一下是:“在表的数据文件中实际上并不保存分区列的信 ...

  9. javac编译时找不到文件的问题和运行项目找不到指定类问题

    问题描述: 刚刚安装完JDK,打开Eclipse创建一个新项目,写了一个测试类进行输出打印语句时,报无法找到相应类. 然后,我跑到CMD中进行javac Test.java运行测试时,报找不到对应文件 ...

  10. 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)

    目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...